Me pregunto si es posible detectar si un navegador se está ejecutando en iOS, de forma similar a cómo se puede detectar con Modernizr (aunque esto obviamente es detección de dispositivos en lugar de detección de características).
Normalmente preferiría la detección de funciones, pero necesito averiguar si un dispositivo es iOS debido a la forma en que manejan los videos según esta pregunta La API de YouTube no funciona con iPad / iPhone / dispositivo sin Flash
javascript
ios
browser
browser-feature-detection
SparrwHawk
fuente
fuente
Respuestas:
Detectando iOS
No soy fanático de la detección de agentes de usuario, pero así es como lo haría:
Otra forma es confiar en
navigator.platform
:iOS
será cualquieratrue
ofalse
¿Por qué no MSStream?
Microsoft inyectó la palabra iPhone en IE11
userAgent
para intentar engañar a Gmail de alguna manera. Por lo tanto, debemos excluirlo. Más información sobre esto aquí y aquí .A continuación se muestra la actualización de IE11
userAgent
( actualización de Internet Explorer para Windows Phone 8.1):Agregue fácilmente más dispositivos, sin usar Expresiones regulares:
iOS()
será cualquieratrue
ofalse
Nota: Tanto
navigator.userAgent
ynavigator.platform
puede ser falsificada por el usuario o una extensión del navegador.Detectando la versión de iOS
La forma más común de detectar la versión de iOS es analizarla desde la cadena del Agente de usuario . Pero también hay inferencia de
detección decaracterísticas* ;Sabemos a ciencia cierta que
history API
se introdujo en iOS4 ,matchMedia API
en iOS5 ,webAudio API
en iOS6 ,WebSpeech API
en iOS7, etc.Nota: El siguiente código no es confiable y se romperá si alguna de estas características HTML5 está en desuso en una versión más reciente de iOS. ¡Usted ha sido advertido!
fuente
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
por lo que esta respuesta debe actualizarseDespués de iOS 13, debe detectar dispositivos iOS como este, ya que el iPad no se detectará como dispositivos iOS de la forma anterior (debido a las nuevas opciones de "escritorio", habilitadas de forma predeterminada):
La primera condición para iOS <13 o iPhone o iPad con el modo de escritorio deshabilitado, la segunda condición para iPadOS 13 en la configuración predeterminada, ya que se posiciona como Macintosh Intel, pero en realidad es el único Macintosh con multitáctil.
Más bien un truco que una solución real, pero funciona de manera confiable para mí
PD Como se dijo anteriormente, probablemente debería agregar el chequeo de IE
fuente
navigator.userAgent
para esta verificación/iPad|iPhone|iPod/.test(navigator.platform)
? Parece quenavigator.platform
siempre devuelve 'MacIntel' para iPhone iOS <= 12navigator.maxTouchPoints
no es compatible con iOS, por lo que esa comprobación no hará nada por usted.Esto establece la variable
_iOSDevice
en verdadero o falsofuente
/iPhone|iPod|iPad/.test(navigator.platform)
puede evitar el!!
Si está utilizando Modernizr , puede agregarle una prueba personalizada.
No importa qué modo de detección decida usar (userAgent, navigator.vendor o navigator.platform), siempre puede envolverlo para un uso posterior más fácil.
fuente
return x ? true : false
areturn Boolean(x)
o simplementereturn !!x
Existen estas pruebas de Modernizr personalizadas: https://gist.github.com/855078
fuente
Una versión simplificada y fácil de ampliar.
fuente
navigator.platform.replace(' Simulator', '')
.['str'].indexOf('string') == -1
Probablemente valga la pena responder que los iPads con iOS 13 se habrán
navigator.platform
configuradoMacIntel
, lo que significa que necesitará encontrar otra forma de detectar dispositivos iPadOS.fuente
Escribí esto hace un par de años, pero creo que todavía funciona:
fuente
Los agentes de usuario en dispositivos iOS dicen iPhone o iPad en ellos. Acabo de filtrar en función de esas palabras clave.
fuente
Siempre que sea posible al agregar pruebas de Modernizr, debe agregar una prueba para una función, en lugar de un dispositivo o sistema operativo. No hay nada de malo en agregar diez pruebas todas las pruebas para iPhone si eso es lo que se necesita. Algunas cosas simplemente no se pueden detectar características.
Por ejemplo, en el iPhone (no en el iPad) el video no se puede reproducir en línea en una página web, se abre a pantalla completa. Así que creé una prueba 'no-inpage-video'
Luego puede usar esto en css (Modernizr agrega una clase
.no-inpagevideo
a la<html>
etiqueta si la prueba falla)Esto ocultará el video en iPhone (lo que en realidad estoy haciendo en este caso es mostrar una imagen alternativa con un clic para reproducir el video; simplemente no quiero que se muestre el reproductor de video predeterminado y el botón de reproducción).
fuente
playsinline
que pueda usarlo'playsInline' in document.createElement('video');
como prueba ahora github.com/Modernizr/Modernizr/issues/2077Wow, hay un montón de código largo y complicado aquí. ¡Mantenlo simple, por favor!
Este es IMHO rápido, ahorra y funciona bien:
ACTUALIZACIÓN: Esto no cubre iPad en modo de escritorio (y, por lo tanto, iPadOS 13 predeterminado).
Eso está bien para mis casos de uso, si no es para ti, mira las respuestas de Justin y Kikiwora.
fuente
iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
en lugar de esto yo haríaiOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform);
como medida de respaldo primo en mi caso navigator.platform no funcionaba, pero hacerlo así más tarde trabajó biennavigator.platform
no funcionó? ¿Estás realmente en iOS entonces? Consulte con jeka.info/test/navigator.html .userAgent
da falsos positivos porque algunos proveedores lo falsifican para imitar los dispositivos de Apple por cualquier motivo.vendor
sólo devuelve oGoogle Inc.
,Apple Computer, Inc.
, o nada (en Firefox).Actualice ligeramente la primera respuesta con un enfoque más funcional.
fuente
MacIntel
También puedes usar
includes
fuente
Ninguna de las respuestas anteriores aquí funciona para todos los principales navegadores en todas las versiones de iOS, incluido iOS 13. Aquí hay una solución que funciona para Safari, Chrome y Firefox para todas las versiones de iOS:
Tenga en cuenta que este fragmento de código se escribió con prioridad en la legibilidad, no en la concisión o el rendimiento.
Explicación:
Si el agente de usuario contiene alguno de "iPod | iPhone | iPad", entonces claramente el dispositivo es iOS. De lo contrario, continúe ...
Cualquier otro agente de usuario que no contenga "Macintosh" no es un dispositivo Apple y, por lo tanto, no puede ser iOS. De lo contrario, es un dispositivo Apple, así que continúe ...
Si
maxTouchPoints
tiene un valor1
igual o mayor, entonces el dispositivo Apple tiene una pantalla táctil y, por lo tanto, debe ser iOS ya que no hay Mac con pantallas táctiles (felicitaciones a kikiwora por mencionarmaxTouchPoints
). Tenga en cuenta quemaxTouchPoints
esundefined
para iOS 12 y versiones inferiores, por lo que necesitamos una solución diferente para ese escenario ...iOS 12 y versiones posteriores tienen una peculiaridad que no existe en Mac OS. La peculiaridad es que la
volume
propiedad de unAudio
elemento no se puede establecer con éxito en ningún valor que no sea1
. Esto se debe a que Apple no permite cambios de volumen en elAudio
elemento para dispositivos iOS, pero sí para Mac OS. Esa peculiaridad se puede usar como el método de respaldo final para distinguir un dispositivo iOS de un dispositivo Mac OS.fuente
En mi caso, el agente de usuario no era lo suficientemente bueno, ya que en el Ipad el agente de usuario era el mismo que en Mac OS, por lo tanto, tuve que hacer un truco desagradable:
fuente
Para detectar la versión de iOS, uno tiene que desestructurar el agente de usuario con un código Javascript como este:
fuente
var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;
fuente