Ich frage mich, ob es möglich ist, zu erkennen, ob ein Browser unter iOS ausgeführt wird, ähnlich wie Sie die Funktionserkennung mit Modernizr durchführen können (obwohl dies offensichtlich eher eine Geräteerkennung als eine Funktionserkennung ist).
Normalerweise würde ich stattdessen die Feature-Erkennung bevorzugen, aber ich muss herausfinden, ob ein Gerät iOS ist, da sie Videos gemäß dieser Frage verarbeiten. Die YouTube-API funktioniert nicht mit iPad / iPhone / Nicht-Flash-Geräten
javascript
ios
browser
browser-feature-detection
SparrwHawk
quelle
quelle
Antworten:
IOS erkennen
Ich bin kein Fan von User Agent-Schnüffeln, aber hier ist, wie Sie es tun würden:
Ein anderer Weg ist, sich auf Folgendes zu verlassen
navigator.platform
:iOS
wird entwedertrue
oder seinfalse
Warum nicht MSStream?
Microsoft hat das Wort iPhone in IE11s eingefügt,
userAgent
um Google Mail irgendwie zu täuschen. Deshalb müssen wir es ausschließen. Mehr Infos dazu hier und hier .Unten ist IE11 aktualisiert
userAgent
(Internet Explorer für Windows Phone 8.1 Update):Fügen Sie einfach weitere Geräte hinzu, ohne reguläre Ausdrücke zu verwenden:
iOS()
wird entwedertrue
oder seinfalse
Hinweis: Beide
navigator.userAgent
undnavigator.platform
können vom Benutzer oder einer Browser-Erweiterung gefälscht werden.IOS-Version erkennen
Die häufigste Methode zum Erkennen der iOS-Version besteht darin, sie aus der User Agent-Zeichenfolge zu analysieren . Aber es gibt auch Feature
ErkennungInferenz * ;Wir wissen für eine Tatsache,
history API
die in iOS4 eingeführt wurde -matchMedia API
in iOS5 -webAudio API
in iOS6 -WebSpeech API
in iOS7 und so weiter.Hinweis: Der folgende Code ist nicht zuverlässig und funktioniert nicht, wenn eine dieser HTML5-Funktionen in einer neueren iOS-Version veraltet ist. Du wurdest gewarnt!
quelle
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
Nach iOS 13 sollten Sie iOS-Geräte wie dieses erkennen, da das iPad auf alte Weise nicht als iOS-Geräte erkannt wird (aufgrund neuer "Desktop" -Optionen, die standardmäßig aktiviert sind):
Die erste Bedingung für iOS <13 oder iPhone oder iPad mit deaktiviertem Desktop-Modus, die zweite Bedingung für iPadOS 13 in der Standardkonfiguration, da es sich wie Macintosh Intel positioniert, aber tatsächlich der einzige Macintosh mit Multi-Touch ist.
Eher ein Hack als eine echte Lösung, aber für mich zuverlässig arbeiten
PS Wie bereits erwähnt, sollten Sie wahrscheinlich die IE-Überprüfung hinzufügen
quelle
navigator.userAgent
für diesen Check verwenden/iPad|iPhone|iPod/.test(navigator.platform)
? Es scheint, dassnavigator.platform
immer "MacIntel" für iPhone iOS <= 12navigator.maxTouchPoints
wird in iOS nicht unterstützt, sodass die Überprüfung nichts für Sie bedeutet.Dies setzt die Variable
_iOSDevice
auf wahr oder falschquelle
/iPhone|iPod|iPad/.test(navigator.platform)
Sie das!!
Wenn Sie Modernizr verwenden , können Sie einen benutzerdefinierten Test hinzufügen.
Es spielt keine Rolle, für welchen Erkennungsmodus Sie sich entscheiden (userAgent, navigator.vendor oder navigator.platform), Sie können ihn jederzeit für eine spätere einfachere Verwendung einpacken.
quelle
return x ? true : false
zureturn Boolean(x)
oder geradereturn !!x
Es gibt diese benutzerdefinierten Modernizr-Tests: https://gist.github.com/855078
quelle
Eine vereinfachte, einfach zu erweiternde Version.
quelle
navigator.platform.replace(' Simulator', '')
.['str'].indexOf('string') == -1
Es lohnt sich wahrscheinlich zu antworten, dass iPads mit iOS 13
navigator.platform
eingestellt sindMacIntel
, was bedeutet, dass Sie einen anderen Weg finden müssen, um iPadOS-Geräte zu erkennen.quelle
Ich habe das vor ein paar Jahren geschrieben, aber ich glaube, es funktioniert immer noch:
quelle
Die Benutzeragenten auf iOS-Geräten sagen iPhone oder iPad in ihnen. Ich filtere nur basierend auf diesen Schlüsselwörtern.
quelle
Wenn immer möglich, sollten Sie beim Hinzufügen von Modernizr-Tests einen Test für eine Funktion anstelle eines Geräts oder Betriebssystems hinzufügen. Es ist nichts Falsches daran, zehn Tests für alle iPhone-Tests hinzuzufügen, wenn dies erforderlich ist. Einige Dinge können einfach nicht erkannt werden.
Beispielsweise kann auf dem iPhone (nicht auf dem iPad) kein Video inline auf einer Webseite abgespielt werden, es wird im Vollbildmodus geöffnet. Also habe ich ein Test-No-Inpage-Video erstellt.
Sie können dies dann in CSS verwenden (Modernizr fügt
.no-inpagevideo
dem<html>
Tag eine Klasse hinzu , wenn der Test fehlschlägt).Dadurch wird das Video auf dem iPhone ausgeblendet (in diesem Fall wird ein alternatives Bild mit einem Klick angezeigt, um das Video abzuspielen. Ich möchte nur nicht, dass der Standard-Videoplayer und die Wiedergabetaste angezeigt werden).
quelle
playsinline
so dass Sie'playsInline' in document.createElement('video');
jetzt als Test verwenden können github.com/Modernizr/Modernizr/issues/2077Wow, viel längerer kniffliger Code hier. Halte es einfach, bitte!
Dieser ist meiner Meinung nach schnell, sicher und funktioniert gut:
UPDATE: Dies gilt nicht für das iPad im Desktop-Modus (und daher für das Standard-iPadOS 13).
Das ist in Ordnung für meine Fälle, wenn es nicht für Sie ist, sehen Sie die Antworten von Justin und Kikiwora.
quelle
iOS = /^(iPhone|iPad|iPod)/.test(navigator.platform);
anstatt dies würde ichiOS = /^(iPhone|iPad|iPod)/.test(navigator.userAgent || navigator.vendor || navigator.platform);
als Fallback-Maßnahme tun, weil in meinem Fall navigator.platform nicht funktioniert hat, aber es wie später zu tun hat gut funktioniertnavigator.platform
hat nicht funktioniert? Bist du dann wirklich auf iOS? Überprüfen Sie mit jeka.info/test/navigator.html .userAgent
gibt falsch positive Ergebnisse aus, da einige Anbieter es fälschen, um Apple-Geräte aus welchen Gründen auch immer nachzuahmen.vendor
gerade Rückkehr entwederGoogle Inc.
,Apple Computer, Inc.
oder nichts (in Firefox).Aktualisieren Sie die erste Antwort leicht mit einem funktionaleren Ansatz.
quelle
MacIntel
Keine der vorherigen Antworten funktioniert für alle gängigen Browser unter allen iOS-Versionen, einschließlich iOS 13. Hier ist eine Lösung, die für Safari, Chrome und Firefox für alle iOS-Versionen funktioniert:
Beachten Sie, dass dieses Code-Snippet mit Priorität auf Lesbarkeit geschrieben wurde, nicht auf Prägnanz oder Leistung.
Erläuterung:
Wenn der Benutzeragent "iPod | iPhone | iPad" enthält, handelt es sich eindeutig um iOS. Ansonsten weiter ...
Jeder andere Benutzeragent, der keinen "Macintosh" enthält, ist kein Apple-Gerät und kann daher nicht iOS sein. Ansonsten handelt es sich um ein Apple-Gerät. Fahren Sie fort ...
Wenn
maxTouchPoints
der Wert1
mindestens größer ist, verfügt das Apple-Gerät über einen Touchscreen und muss daher iOS sein, da es keine Macs mit Touchscreens gibt (ein großes Lob an Kikiwora für die ErwähnungmaxTouchPoints
). Beachten Sie, dassmaxTouchPoints
istundefined
für iOS 12 und unten, so dass wir eine andere Lösung für dieses Szenario benötigen ...iOS 12 und niedriger hat eine Eigenart, die unter Mac OS nicht vorhanden ist. Die Besonderheit ist, dass die
volume
Eigenschaft einesAudio
Elements nicht erfolgreich auf einen anderen Wert als gesetzt werden kann1
. Dies liegt daran, dass AppleAudio
für iOS-Geräte keine Volumenänderungen für das Element zulässt , für Mac OS jedoch. Diese Eigenart kann als endgültige Fallback-Methode zur Unterscheidung eines iOS-Geräts von einem Mac OS-Gerät verwendet werden.quelle
Sie können auch verwenden
includes
quelle
In meinem Fall war der Benutzeragent nicht gut genug, da der Benutzeragent auf dem iPad derselbe war wie unter Mac OS, daher musste ich einen fiesen Trick machen:
quelle
Um die iOS-Version zu erkennen, muss der Benutzeragent mit einem Javascript-Code wie folgt zerstört werden:
quelle
var isiOSSafari = (navigator.userAgent.match(/like Mac OS X/i)) ? true: false;
quelle