Je me demande s'il est possible de détecter si un navigateur fonctionne sur iOS, de la même manière que vous pouvez détecter avec Modernizr (bien que ce soit évidemment la détection d'appareil plutôt que la détection de fonctionnalité).
Normalement, je préférerais la détection des fonctionnalités, mais je dois savoir si un appareil est iOS en raison de la façon dont ils gèrent les vidéos conformément à cette question. L' API YouTube ne fonctionne pas avec iPad / iPhone / appareil non Flash
javascript
ios
browser
browser-feature-detection
SparrwHawk
la source
la source
Réponses:
Détection d'iOS
Je ne suis pas un fan de reniflement d'agent utilisateur, mais voici comment vous le feriez:
Une autre façon repose sur
navigator.platform
:iOS
sera soittrue
oufalse
Pourquoi pas MSStream
Microsoft a injecté le mot iPhone dans IE11
userAgent
afin d'essayer de tromper Gmail d'une manière ou d'une autre. Nous devons donc l'exclure. Plus d'informations ici et ici .Ci-dessous, la mise à jour d'IE11
userAgent
(Internet Explorer pour Windows Phone 8.1 Update):Ajoutez facilement plus d'appareils, sans utiliser d'expressions régulières:
iOS()
sera soittrue
oufalse
Remarque: Les deux
navigator.userAgent
etnavigator.platform
peuvent être falsifiés par l'utilisateur ou une extension de navigateur.Détection de la version iOS
La façon la plus courante de détecter la version iOS consiste à l' analyser à partir de la chaîne de l'agent utilisateur . Mais il existe également une inférence de
détection defonctionnalité * ;Nous savons pour un fait qui a
history API
été introduit dans iOS4 -matchMedia API
dans iOS5 -webAudio API
dans iOS6 -WebSpeech API
dans iOS7 et ainsi de suite ..Remarque: Le code suivant n'est pas fiable et se cassera si l'une de ces fonctionnalités HTML5 est déconseillée dans une version iOS plus récente. Tu étais prévenu!
la source
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
Après iOS 13, vous devriez détecter les appareils iOS comme celui-ci, car l'iPad ne sera pas détecté en tant qu'appareil iOS par les anciennes méthodes (en raison des nouvelles options "de bureau", activées par défaut):
La première condition pour iOS <13 ou iPhone ou iPad avec le mode Bureau désactivé, la deuxième condition pour iPadOS 13 dans la configuration par défaut, car il se positionne comme Macintosh Intel, mais est en fait le seul Macintosh avec multi-touch.
Plutôt un hack qu'une vraie solution, mais fonctionne de manière fiable pour moi
PS Comme cela a été dit plus tôt, vous devriez probablement ajouter une vérification IE
la source
navigator.userAgent
pour cette vérification/iPad|iPhone|iPod/.test(navigator.platform)
? Il semble quenavigator.platform
renvoie toujours «MacIntel» pour iPhone iOS <= 12navigator.maxTouchPoints
n'est pas pris en charge dans iOS, de sorte que la vérification ne fera rien pour vous.Cela définit la variable
_iOSDevice
sur vrai ou fauxla source
/iPhone|iPod|iPad/.test(navigator.platform)
vous pouvez éviter le!!
Si vous utilisez Modernizr , vous pouvez lui ajouter un test personnalisé.
Peu importe le mode de détection que vous décidez d'utiliser (userAgent, navigator.vendor ou navigator.platform), vous pouvez toujours le boucler pour une utilisation plus facile plus tard.
la source
return x ? true : false
àreturn Boolean(x)
ou tout simplementreturn !!x
Il y a ces tests Modernizr personnalisés: https://gist.github.com/855078
la source
Une version simplifiée et facile à étendre.
la source
navigator.platform.replace(' Simulator', '')
.['str'].indexOf('string') == -1
Il vaut probablement la peine de répondre que les iPads exécutant iOS 13 auront été
navigator.platform
configurésMacIntel
, ce qui signifie que vous devrez trouver un autre moyen de détecter les appareils iPadOS.la source
J'ai écrit cela il y a quelques années, mais je pense que cela fonctionne toujours:
la source
Les agents utilisateurs sur les appareils iOS indiquent l'iPhone ou l'iPad. Je filtre simplement en fonction de ces mots clés.
la source
Dans la mesure du possible, lors de l'ajout de tests Modernizr, vous devez ajouter un test pour une fonctionnalité plutôt qu'un appareil ou un système d'exploitation. Il n'y a rien de mal à ajouter dix tests tous les tests pour iPhone si c'est ce qu'il faut. Certaines choses ne peuvent tout simplement pas être détectées.
Par exemple, sur l'iPhone (pas l'iPad), la vidéo ne peut pas être lue en ligne sur une page Web, elle s'ouvre en plein écran. J'ai donc créé un test «pas de vidéo en page»
Vous pouvez ensuite l'utiliser dans css (Modernizr ajoute une classe
.no-inpagevideo
à la<html>
balise si le test échoue)Cela masquera la vidéo sur iPhone (ce que je fais en fait dans ce cas est de montrer une image alternative avec un onclick pour lire la vidéo - je ne veux tout simplement pas que le lecteur vidéo par défaut et le bouton de lecture s'affichent).
la source
playsinline
que vous puissiez l'utiliser'playsInline' in document.createElement('video');
comme test maintenant github.com/Modernizr/Modernizr/issues/2077Wow, beaucoup de code délicat et long ici. Restez simple, s'il vous plaît!
Celui-ci est IMHO rapide, enregistre et fonctionne bien:
MISE À JOUR: Cela ne couvre pas l'iPad en mode bureau (et donc l'iPadOS 13 par défaut).
C'est bien pour mes cas d'utilisation, si ce n'est pas pour vous, voir les réponses de Justin et kikiwora.
la source
iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
plutôt que cela, je feraisiOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform);
une mesure de secours cuz dans mon cas, navigator.platform ne fonctionnait pas, mais le faire comme plus tard fonctionnait biennavigator.platform
n'a pas fonctionné? Êtes-vous vraiment sur iOS alors?. Vérifiez auprès de jeka.info/test/navigator.html .userAgent
donne des faux positifs parce que certains fournisseurs le simulent pour imiter les appareils Apple pour quelque raison que ce soit.vendor
juste retourne soitGoogle Inc.
,Apple Computer, Inc.
ou rien (dans Firefox).Mettez légèrement à jour la première réponse en utilisant une approche plus fonctionnelle.
la source
MacIntel
Vous pouvez aussi utiliser
includes
la source
Aucune des réponses précédentes ne fonctionne pour tous les principaux navigateurs sur toutes les versions d'iOS, y compris iOS 13. Voici une solution qui fonctionne pour Safari, Chrome et Firefox pour toutes les versions d'iOS:
Notez que cet extrait de code a été écrit en priorité sur la lisibilité, pas sur la concision ou les performances.
Explication:
Si l'agent utilisateur contient l'un des "iPod | iPhone | iPad", alors clairement l'appareil est iOS. Sinon, continuez ...
Tout autre agent utilisateur qui ne contient pas "Macintosh" n'est pas un appareil Apple et ne peut donc pas être iOS. Sinon, c'est un appareil Apple, alors continuez ...
S'il
maxTouchPoints
a une valeur1
supérieure ou égale à, l'appareil Apple a un écran tactile et doit donc être iOS car il n'y a pas de Mac avec écran tactile (bravo à kikiwora pour le mentionnermaxTouchPoints
). Notez quemaxTouchPoints
c'estundefined
pour iOS 12 et inférieur, nous avons donc besoin d'une solution différente pour ce scénario ...iOS 12 et les versions antérieures ont une bizarrerie qui n'existe pas sous Mac OS. La particularité est que la
volume
propriété d'unAudio
élément ne peut pas être définie avec succès sur une valeur autre que1
. En effet, Apple n'autorise pas les changements de volume sur l'Audio
élément pour les appareils iOS, mais le permet pour Mac OS. Cette bizarrerie peut être utilisée comme méthode de secours finale pour distinguer un appareil iOS d'un appareil Mac OS.la source
Dans mon cas, l'agent utilisateur n'était pas assez bon car dans l'Ipad, l'agent utilisateur était le même que sous Mac OS, j'ai donc dû faire un mauvais tour:
la source
Afin de détecter la version iOS, il faut détruire l'agent utilisateur avec un code Javascript comme celui-ci:
la source
var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;
la source