Мне интересно, можно ли определить, работает ли браузер на iOS, подобно тому, как вы можете определять функцию с помощью Modernizr (хотя это, очевидно, обнаружение устройства, а не обнаружение функции).
Обычно я предпочел бы вместо этого обнаружение функций, но мне нужно выяснить, является ли устройство iOS из-за того, как они обрабатывают видео, в соответствии с этим вопросом YouTube API не работает с iPad / iPhone / не-Flash устройством
javascript
ios
browser
browser-feature-detection
SparrwHawk
источник
источник
Ответы:
Обнаружение iOS
Я не фанат фальсификации User Agent, но вот как вы это сделаете:
Другой способ полагаться на
navigator.platform
:iOS
будет либоtrue
илиfalse
Почему не MSStream
Microsoft ввела слово iPhone в IE11,
userAgent
чтобы попытаться обмануть Gmail. Поэтому мы должны исключить это. Подробнее об этом здесь и здесь .Ниже обновлено IE11
userAgent
(Internet Explorer для Windows Phone 8.1 Update):Легко добавляйте больше устройств, не используя регулярные выражения:
iOS()
будет либоtrue
илиfalse
Примечание: оба
navigator.userAgent
иnavigator.platform
могут быть подделаны пользователем или расширением браузера.Определение версии iOS
Наиболее распространенный способ определения версии iOS - анализ ее по строке User Agent . Но есть также вывод
обнаруженияфункции* ;Мы точно знаем, что
history API
было представлено в iOS4 -matchMedia API
в iOS5 -webAudio API
в iOS6 -WebSpeech API
в iOS7 и так далее ...Примечание . Следующий код не является надежным и будет поврежден, если какая-либо из этих функций HTML5 устарела в более новой версии iOS. Вы были предупреждены!
источник
var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
поэтому этот ответ необходимо обновитьПосле iOS 13 вы должны обнаруживать устройства iOS, подобные этому, поскольку iPad не будет определяться как устройства iOS старыми способами (из-за новых опций «рабочего стола», включенных по умолчанию):
Первое условие для iOS <13 или iPhone или iPad с отключенным режимом рабочего стола, второе условие для iPadOS 13 в конфигурации по умолчанию, поскольку он позиционирует себя как Macintosh Intel, но на самом деле является единственным Macintosh с мультитач.
Скорее взломать, чем реальное решение, но работать надежно для меня
PS Как было сказано ранее, вы, вероятно, должны добавить проверку IE
источник
navigator.userAgent
для этой проверки/iPad|iPhone|iPod/.test(navigator.platform)
? Кажется, чтоnavigator.platform
всегда возвращает «MacIntel» для iPhone iOS <= 12navigator.maxTouchPoints
не поддерживается в iOS, так что проверка ничего не сделает для вас.Это устанавливает переменную
_iOSDevice
в true или falseисточник
/iPhone|iPod|iPad/.test(navigator.platform)
вы можете избежать!!
Если вы используете Modernizr , вы можете добавить собственный тест для него.
Неважно, какой режим обнаружения вы решите использовать (userAgent, navigator.vendor или navigator.platform), вы всегда можете свернуть его для более удобного использования позже.
источник
return x ? true : false
доreturn Boolean(x)
или простоreturn !!x
Есть этот кастомный тест Модернизра: https://gist.github.com/855078
источник
Упрощенная, легко расширяемая версия.
источник
navigator.platform.replace(' Simulator', '')
.['str'].indexOf('string') == -1
Вероятно, стоит ответить, что iPad под управлением iOS 13 будет
navigator.platform
установлен наMacIntel
, что означает, что вам нужно будет найти другой способ обнаружения устройств iPadOS.источник
Я написал это пару лет назад, но я верю, что это все еще работает:
источник
Пользовательские агенты на устройствах iOS говорят iPhone или iPad в них. Я просто фильтрую по этим ключевым словам.
источник
Везде, где возможно, при добавлении тестов Modernizr вы должны добавлять тест для функции, а не устройства или операционной системы. Нет ничего плохого в том, чтобы добавить десять тестов для iPhone, если это то, что нужно. Некоторые вещи просто не могут быть обнаружены.
Например, на iPhone (а не на iPad) видео нельзя воспроизводить на веб-странице, оно открывается на весь экран. Итак, я создал тест «no-inpage-video»
Затем вы можете использовать это в css (Modernizr добавляет класс
.no-inpagevideo
к<html>
тегу, если тест не пройден)Это скроет видео на iPhone (в данном случае я на самом деле показываю альтернативное изображение с кликом для воспроизведения видео - я просто не хочу показывать видеоплеер и кнопку воспроизведения по умолчанию).
источник
playsinline
так что вы можете использовать'playsInline' in document.createElement('video');
в качестве теста сейчас github.com/Modernizr/Modernizr/issues/2077Вау, много длинного хитрого кода здесь. Будьте проще, пожалуйста!
Это ИМХО быстро, сохранить и работать хорошо:
ОБНОВЛЕНИЕ: Это не распространяется на iPad в режиме рабочего стола (и, следовательно, по умолчанию iPadOS 13).
Это хорошо для моих случаев использования, если это не для вас, посмотрите ответы Джастина и Кикиворы.
источник
iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
вместо этого я хотел бы использоватьiOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform);
в качестве запасного варианта, потому что в моем случае navigator.platform не работал, но делал это, как позже, работал нормальноnavigator.platform
не работал? Вы действительно на iOS тогда? Проверьте с jeka.info/test/navigator.html .userAgent
дает ложные срабатывания, потому что некоторые производители подделывают его, чтобы имитировать устройства Apple по тем или иным причинам.vendor
просто возвращает либоGoogle Inc.
,Apple Computer, Inc.
либо ничего (в Firefox).Немного обновите первый ответ, используя более функциональный подход.
источник
MacIntel
Вы также можете использовать
includes
источник
Ни один из предыдущих ответов здесь не работает для всех основных браузеров на всех версиях iOS, включая iOS 13. Вот решение, которое работает для Safari, Chrome и Firefox для всех версий iOS:
Обратите внимание, что этот фрагмент кода был написан с приоритетом удобочитаемости, а не краткости или производительности.
Объяснение:
Если пользовательский агент содержит какой-либо из «iPod | iPhone | iPad», то, очевидно, это устройство iOS. В противном случае продолжайте ...
Любой другой пользовательский агент, который не содержит «Macintosh», не является устройством Apple и, следовательно, не может быть iOS. В противном случае это устройство Apple, так что продолжайте ...
Если
maxTouchPoints
имеет значение1
или больше, то устройство Apple имеет сенсорный экран и, следовательно, должно быть iOS, так как нет Mac с сенсорными экранами (спасибо kikiwora для упоминанияmaxTouchPoints
). Обратите внимание, чтоmaxTouchPoints
этоundefined
для iOS 12 и ниже, поэтому нам нужно другое решение для этого сценария ...iOS 12 и ниже имеет причуду, которой нет в Mac OS. Странность заключается в том, что для
volume
свойстваAudio
элемента не может быть успешно установлено любое значение, кроме1
. Это связано с тем, что Apple не разрешает изменение громкостиAudio
элемента для устройств iOS, но разрешает для Mac OS. Эту причуду можно использовать как окончательный запасной метод для различения устройства iOS от устройства Mac OS.источник
В моем случае пользовательский агент был недостаточно хорош, поскольку в Ipad пользовательский агент был таким же, как в Mac OS, поэтому мне пришлось сделать неприятный трюк:
источник
Чтобы определить версию iOS, нужно деструктурировать пользовательский агент с помощью кода Javascript, например:
источник
var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;
источник