Ich frage mich, ob es möglich ist, zu erkennen, ob ein Browser unter iOS ausgeführt wird, ähnlich wie Sie mit Modernizr Funktionen erkennen 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 anhand dieser Frage herausfinden, ob ein Gerät iOS ist, da es mit Videos nicht funktioniert. YouTube-API funktioniert nicht mit iPad/iPhone/Nicht-iPhone Flash-Gerät
Ich bin kein Fan von User Agent Sniffing, aber hier ist, wie Sie es tun würden:
_var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
_
Ein anderer Weg ist, sich auf _navigator.platform
_ zu verlassen:
_var iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
_
iOS
ist entweder true
oder false
Microsoft hat das Word iPhone in das userAgent
von IE11 injiziert, um zu versuchen, Gmail irgendwie zu täuschen. Deshalb müssen wir es ausschließen. Mehr Infos dazu hier und hier .
Nachfolgend finden Sie das aktualisierte userAgent
für IE11 (Internet Explorer für Windows Phone 8.1 Update):
Mozilla/5.0 (Mobil; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv: 11.0; IEMobile/11.0; NOKIA; Lumia 930) wie iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, wie Gecko) Mobile Safari/537
Fügen Sie ganz einfach weitere Geräte hinzu, ohne reguläre Ausdrücke zu verwenden:
_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()
ist entweder true
oder false
Hinweis: Sowohl _navigator.userAgent
_ als auch _navigator.platform
_ können vom Benutzer oder einer Browsererweiterung gefälscht werden.
Die gängigste Methode zum Erkennen der iOS-Version ist Parsen anhand der User Agent-Zeichenfolge . Es gibt aber auch eine Funktion erkennung Inferenz * ;
Wir wissen, dass _history API
_ in iOS4 - _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 mehr, wenn eine dieser HTML5-Funktionen in einer neueren iOS-Version nicht mehr unterstützt wird. Du wurdest gewarnt!
_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';
}
_
Dies setzt die Variable _iOSDevice
auf true oder false
_iOSDevice = !!navigator.platform.match(/iPhone|iPod|iPad/);
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 einbinden.
//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');
}
Es gibt diese benutzerdefinierten Modernizr-Tests: https://Gist.github.com/855078
Eine vereinfachte, einfach zu erweiterende Version.
var iOS = ['iPad', 'iPhone', 'iPod'].indexOf(navigator.platform) >= 0;
Wenn 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 es das ist, was es braucht. Einige Dinge können einfach nicht erkannt werden.
Modernizr.addTest('inpagevideo', function ()
{
return navigator.userAgent.match(/(iPhone|iPod)/g) ? false : true;
});
Beispielsweise kann auf dem iPhone (nicht auf dem iPad) ein Video nicht inline auf einer Webseite abgespielt werden, sondern es wird im Vollbildmodus geöffnet. Also habe ich einen Test 'no-inpage-video' erstellt
Sie können dies dann in CSS verwenden (Modernizr fügt dem Tag .no-inpagevideo
eine Klasse <html>
hinzu, wenn der Test fehlschlägt).
.no-inpagevideo video.product-video
{
display: none;
}
Dadurch wird das Video auf dem iPhone ausgeblendet (in diesem Fall wird ein alternatives Bild mit einem Klick zum Abspielen des Videos angezeigt - ich möchte nur nicht, dass der Standard-Videoplayer und die Wiedergabetaste angezeigt werden).
Ich habe das vor ein paar Jahren geschrieben, aber ich glaube, es funktioniert immer noch:
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");
}
In den Benutzeragenten auf iOS-Geräten steht iPhone oder iPad. Ich filtere nur nach diesen Schlüsselwörtern.
Wow, hier ist eine Menge langwieriger, kniffliger Code. Halte es einfach, bitte!
Dieser ist meiner Meinung nach schnell, sicher und funktioniert gut:
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);
Aktualisieren Sie die erste Antwort leicht mit einem funktionaleren Ansatz.
const isIOS = [
'iPad Simulator',
'iPhone Simulator',
'iPod Simulator',
'iPad',
'iPhone',
'iPod',
]
.map(device => navigator.platform === device)
.filter(device => device)
.reduce(() => true, false);
Es lohnt sich wahrscheinlich zu beantworten, dass auf iPads mit iOS 13 navigator.platform
auf MacIntel
eingestellt ist, was bedeutet, dass Sie einen anderen Weg finden müssen, um iPadOS-Geräte zu erkennen.