Определите, является ли устройство iOS



Мне интересно, можно ли определить, работает ли браузер на iOS, подобно тому, как вы можете обнаруживать функции с помощью Modernizr (хотя это, очевидно, обнаружение устройств, а не обнаружение функций).



обычно я бы предпочел обнаружение функций вместо этого, но мне нужно выяснить, является ли устройство iOS из-за того, как они обрабатывают видео в соответствии с этим вопросом API YouTube не работает с iPad / iPhone / non-Flash device

879   11  

11 ответов:

обнаружение iOS

я не поклонник нюхания пользовательского агента, но вот как вы это сделаете:

var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

другой способ полагается на navigator.platform:

var iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);

iOS будет true или false

почему не MSStream

Microsoft ввела слово iPhone в для того, чтобы попытаться обмануть Gmail как-то. Поэтому мы должны исключить его. Подробнее об этом здесь и здесь.

ниже обновлено IE11 userAgent (Internet Explorer для Windows Phone 8.1 Update):

Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident / 7.0; Touch; rv: 11.0; IEMobile/11.0; NOKIA; Lumia 930) как iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, как Gecko) Mobile Safari / 537


легко добавить больше устройств, без использования обычных Выражения:

function iOS() {

  var iDevices = [
    'iPad Simulator',
    'iPhone Simulator',
    'iPod Simulator',
    'iPad',
    'iPhone',
    'iPod'
  ];

  if (!!navigator.platform) {
    while (iDevices.length) {
      if (navigator.platform === iDevices.pop()){ return true; }
    }
  }

  return false;
}

iOS() будет true или false

Примечание: и navigator.userAgent и navigator.platform может быть подделан пользователем или расширением браузера.


обнаружение версии iOS

наиболее распространенным способом обнаружения версии iOS является разбор его из строки агента пользователя. Но есть еще и характеристика определение вывод*;

мы точно знаем, что history API представил в под управлением ios4 -matchMedia API на iOS5 -webAudio API на iOS6 -WebSpeech API на iOS7 и так далее..

Примечание: следующий код не является надежным и сломается, если какая-либо из этих функций HTML5 устарела в новой версии iOS. Вы были предупреждены!

function iOSversion() {

  if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
    if (!!window.indexedDB) { return 'iOS 8 and up'; }
    if (!!window.SpeechSynthesisUtterance) { return 'iOS 7'; }
    if (!!window.webkitAudioContext) { return 'iOS 6'; }
    if (!!window.matchMedia) { return 'iOS 5'; }
    if (!!window.history && 'pushState' in window.history) { return 'iOS 4'; }
    return 'iOS 3 or earlier';
  }

  return 'Not an iOS device';
}

Если вы используете Modernizr, вы можете добавить пользовательское тестирование.

не имеет значения, какой режим обнаружения вы решили использовать (userAgent, navigator.поставщик или навигатор.платформа), вы всегда можете обернуть его для более легкого использования позже.

//Add Modernizr test
Modernizr.addTest('isios', function() {
    return navigator.userAgent.match(/(iPad|iPhone|iPod)/g);
});

//usage
if (Modernizr.isios) {
    //this adds ios class to body
    Modernizr.prefixed('ios');
} else {
    //this adds notios class to body
    Modernizr.prefixed('notios');
}

есть этот пользовательский Modernizr тесты:https://gist.github.com/855078

Это устанавливает переменную _iOSDevice to правда или ложные

_iOSDevice = !!navigator.platform.match(/iPhone|iPod|iPad/);

пользовательские агенты на устройствах iOS говорят iPhone или iPad в них. Я просто фильтрую на основе этих ключевых слов.

упрощенная, легко расширяемая версия.

var iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0;

Я написал это пару лет назад, но я считаю, что это все еще работает:

if(navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.match(/iPhone/i) || (navigator.userAgent.match(/iPod/i))) 

    {

        alert("Ipod or Iphone");

    }

else if (navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.match(/iPad/i))  

    {

        alert("Ipad");

    }

else if (navigator.vendor != null && navigator.vendor.match(/Apple Computer, Inc./) && navigator.userAgent.indexOf('Safari') != -1)

    {

        alert("Safari");

    }

else if (navigator.vendor == null || navigator.vendor != null)

    {

        alert("Not Apple Based Browser");

    }

везде, где это возможно при добавлении тесты Modernizr вы должны добавить тест для функции, а не устройства или операционной системы. Нет ничего плохого в добавлении десяти тестов все тестирование для iPhone, если это то, что нужно. Некоторые вещи просто не могут быть обнаружены.

    Modernizr.addTest('inpagevideo', function ()
    {
        return navigator.userAgent.match(/(iPhone|iPod)/g) ? false : true;
    });

например, на iPhone (не iPad) видео не может быть воспроизведено встраиваемым на веб-странице, он открывает полный экран. Поэтому я создал тест 'no-inpage-video'

затем вы можете использовать это в CSS (Modernizr добавляет класс .no-inpagevideo до <html> - тег, если тест не пройден)

.no-inpagevideo video.product-video 
{
     display: none;
}

это скроет видео на iPhone (то, что я на самом деле делаю в этом случае, показывает альтернативное изображение с помощью onclick для воспроизведения видео - я просто не хочу, чтобы по умолчанию отображался видеоплеер и кнопка воспроизведения).

Вау, здесь много длинноватого сложного кода. Будь проще, пожалуйста!

это ИМХО быстро, сохранить, и работает хорошо:

 iOS = /^iP/.test(navigator.platform);

 // or, more future-proof (in theory, probably not in practice):

 iOS = /^iP(hone|[ao]d)/.test(navigator.platform);

 // or, if you prefer readability:

 iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
  • это быстрее, потому что регулярное выражение проверяет ^sположение тартинга строки платформы сначала и останавливается, если нет " iP " (быстрее, чем поиск длинной строки UA до конца в любом случае)
  • это безопаснее, чем проверка UA (предполагая навигатор.платформа менее вероятно подделана)
  • обнаруживает iPhone / для iPad симулятор

чтобы обнаружить версию iOS, нужно уничтожить пользовательский агент с помощью кода Javascript следующим образом:

 var res = navigator.userAgent.match(/; CPU.*OS (\d_\d)/);
    if(res) {
        var strVer = res[res.length-1];
        strVer = strVer.replace("_", ".");
        version = strVer * 1;
    }

var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;

Comments

    Ничего не найдено.