Wie erkennt man den Gerätenamen in Safari unter iOS 13, obwohl nicht der richtige Benutzeragent angezeigt wird?
Lesezeit: 7 Minuten
Said Amanzadeh
Nach der Veröffentlichung von Apples iOS 13 wurde mir klar window.navigator.userAgent in Safari auf dem iPad iOS 13 ist dasselbe wie auf MacOS. Etwas wie das:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
Wie Sie sehen, ist es ein falscher User-Agent für das iPad und es gibt keine Möglichkeit zu erkennen, ob das aktuelle Gerät ein iDevice ist.
Nach einer ersten Recherche habe ich einen Workaround dafür gefunden:
Gehen Sie zu Einstellungen -> Safari -> Desktop-Website anfordern -> Alle Websites. Sie bemerken, dass „Alle Websites“ angezeigt wird standardmäßig aktiviert. Wenn du deaktivieren it und get window.navigator.userAgent wird nun der richtige User Agent angezeigt.
Aber ich kann nicht jeden Benutzer bitten, diese Einstellungsänderung für jedes Gerät vorzunehmen. Also habe ich versucht, einen anderen Weg zu finden und bin schließlich beim Schreiben gelandet Der folgende Code, der überprüft, ob es sich um Safari, MacOS und Touchscreen handelt, sollte das Gerät ein mobiles Apple-Gerät seinaber ich frage mich, gibt es einen besseren Vorschlag / Weg, um den richtigen Gerätenamen in Safari iOS 13 zu erkennen?
detectOs = function(){
//returns OS name, like "mac"
};
//is Safari on an apple touch-screen device
isSafariInIdevice = function(){
if (/Safari[\/\s](\d+\.\d+)/.test(windows.navigator.userAgent)) {
return 'ontouchstart' in window && detectOs() === "mac";
}
return false;
};
Ich habe das gleiche Problem, aber ich muss auf der Serverseite nachsehen, damit ich das Menü der mobilen Seite anstelle des vollständigen Website-Menüs auf Safari iOS13 anzeigen kann. könntest du mir bitte dabei helfen? stackoverflow.com/questions/58344491/…
– Neuentwickler
13. Oktober 2019 um 2:22 Uhr
Warum musst du das wissen? Im Allgemeinen ist Browser-Sniffing eine schlechte Idee. Stattdessen sollten Sie Ihre Anwendung so schreiben, dass sie auf allen Browsern gleichermaßen funktioniert. Wenn Sie zwischen den Fähigkeiten von Browsern unterscheiden müssen, schauen Sie nach Merkmalserkennung.
– RoToRa
15. Oktober 2019 um 8:52 Uhr
OP können Sie bitte die Antwort von @kikiwora als akzeptiert markieren
– Daniel Lizik
31. Oktober 2019 um 1:48 Uhr
OP, könnten Sie die Antwort von @kikiwora als akzeptiert markieren, wenn sie Ihr Problem tatsächlich gelöst hat? Wenn nicht, teilen Sie uns bitte mit, ob Sie mit dieser Lösung auf andere Probleme gestoßen sind.
– Hermann Schachner
20. November 2019 um 13:55 Uhr
kikiwora
In der Tat, während die Optionsänderung in den Einstellungen eine gute Lösung für den Benutzer sein kann, können Sie sich als Entwickler nicht darauf verlassen. Es ist so seltsam, den Benutzer zu bitten, den Dunkelmodus nicht zu verwenden, da Ihre App ihn nicht unterstützt, anstatt ihn mit plist abzulehnen.
Was mich betrifft, ist die einfachste Möglichkeit, iOS / iPad OS-Geräte jetzt zu erkennen:
Die erste Bedingung ist altmodisch und funktioniert mit früheren Versionen, während die zweite Bedingung für iPad OS 13 funktioniert, das sich jetzt selbst identifiziert als:
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)"
die von allen mir bekannten Plattformdetektoren (vorerst) weder als Mobil noch als Desktop erkannt wird.
Da sich iPad OS nun Macintosh nennt, aber echte Macs keine Multi-Touch-Unterstützung haben, ist diese Lösung ideal, um iPad OS-Geräte zu erkennen, die die einzigen existierenden Multi-Touch-„Macintosh“-Geräte sind.
PS
Außerdem sollten Sie diese Überprüfung erweitern, damit der IE nicht als iOS-Gerät erkannt wird
danke, das ist nützlich für clientside. Könnten Sie bitte helfen, wie Sie in Razor-Syntax auf der Serverseite erkennen, wenn die Seite gerendert wird? schwer mit diesem Problem stecken. stackoverflow.com/questions/58344491/…
– Neuentwickler
13. Oktober 2019 um 2:03 Uhr
Ich bin nicht geübt mit einem Rasierer, tut mir leid 🤷🏻♂️ Außerdem glaube ich nicht, dass das auf der Serverseite möglich ist, da das iPad den Macintosh-Header an den Server sendet – das iPad soll jetzt wie ein Desktop im Web funktionieren und wir sollten nicht eingreifen Dieses Verhalten
– kikiwora
14. Oktober 2019 um 7:42 Uhr
Diese Lösung wurde in erster Linie für Safari entwickelt. Es ist seltsam, dass die Mozilla-Site diese JS-Methode als in Safari nicht unterstützt auflistet. Es funktioniert definitiv auf allen meinen Apple-Geräten (Laptop, Tablet und Telefon). Aber in der Tat ist die Kehrseite dieser Methode aus Sicht der langfristigen Nutzung sehr fragil. Vor allem, wenn Touch-fähige Macs verfügbar sein werden. Die Sache ist, wie gesagt, dass das neue Safari so sein soll – es wurde entwickelt, um als Desktop erkannt zu werden, um mehr Funktionen für Benutzer bereitzustellen, da moderne Websites stattdessen oft nicht so funktionale mobile Versionen sind und Benutzer dazu zwingen, sie zu verwenden .
– kikiwora
19. Oktober 2019 um 9:35 Uhr
Danke für diese Lösung. Das hat behoben, wofür ich es brauchte. Obwohl es langfristig nicht die beste Lösung ist, ist es ein gutes Pflaster, bis entweder Apple mit Touchscreen-Computern herauskommt oder sie ihren Mist zusammenkriegen und ihre Geräte richtig benennen!
– Thomas Kellough
22. Mai 2020 um 21:08 Uhr
⚠️ Nur als Hinweis – dieser Code könnte bald veraltet sein, da wir jetzt Apple-Silikon-basierte Macs haben und ein Hinweis bezüglich Touch-basierter Macs in den App Store-Animationen gefunden und seit einiger Zeit sogar öffentlich angezeigt wird.
Als Alternative zur akzeptierten Antwort habe ich festgestellt, dass Sie die verwenden können navigator.standalone Parameter Es ist kein Standard und wird derzeit nur auf iOS Safari verwendet:
Navigator.eigenständig
Gibt einen booleschen Wert zurück, der angibt, ob der Browser im eigenständigen Modus ausgeführt wird. Nur für iOS Safari von Apple verfügbar.
In Kombination mit navigator.platform === "MacIntel" iPads sind daher die einzigen Geräte, die diese Eigenschaft definieren typeof navigator.standalone !== "undefined" filtert Macs heraus, auf denen Safari läuft (Touchscreen oder nicht).
sollte es nicht sein isIpadSafari = ?
– Kofifus
24. September 2020 um 4:14 Uhr
@kofifus der erste Teil der OR-Bedingungstests für iPad//iPhone/iPod in der Plattformzeichenfolge. Der zweite Teil ist das iOS 13 iPad, also sucht es nicht nur nach iPads, auf denen Safari läuft
– GuyC
25. September 2020 um 11:46 Uhr
Mahmud D. Alghraibeh
function mobileDetect() {
var agent = window.navigator.userAgent;
var d = document;
var e = d.documentElement;
var g = d.getElementsByTagName('body')[0];
var deviceWidth = window.innerWidth || e.clientWidth || g.clientWidth;
// Chrome
IsChromeApp = window.chrome && chrome.app && chrome.app.runtime;
// iPhone
IsIPhone = agent.match(/iPhone/i) != null;
// iPad up to IOS12
IsIPad = (agent.match(/iPad/i) != null) || ((agent.match(/iPhone/i) != null) && (deviceWidth > 750)); // iPadPro when run with no launch screen can have error in userAgent reporting as an iPhone rather than an iPad. iPadPro width portrait 768, iPhone6 plus 414x736 but would probably always report 414 on app startup
if (IsIPad) IsIPhone = false;
// iPad from IOS13
var macApp = agent.match(/Macintosh/i) != null;
if (macApp) {
// need to distinguish between Macbook and iPad
var canvas = document.createElement("canvas");
if (canvas != null) {
var context = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
if (context) {
var info = context.getExtension("WEBGL_debug_renderer_info");
if (info) {
var renderer = context.getParameter(info.UNMASKED_RENDERER_WEBGL);
if (renderer.indexOf("Apple") != -1) IsIPad = true;
}
;
}
;
}
;
}
;
// IOS
IsIOSApp = IsIPad || IsIPhone;
// Android
IsAndroid = agent.match(/Android/i) != null;
IsAndroidPhone = IsAndroid && deviceWidth <= 960;
IsAndroidTablet = IsAndroid && !IsAndroidPhone;
message = ""
if (IsIPhone) {
message = "Device is IsIPhone"
}
else if (IsIPad) {
message = "Device is ipad"
} else if (IsAndroidTablet || IsAndroidPhone || IsAndroid) {
message = "Device is Android"
} else {
message = "Device is Mac || Windows Desktop"
}
return {
message: message,
isTrue: IsIOSApp || IsAndroid || IsAndroidTablet || IsAndroidPhone
}
}
const checkMobile = mobileDetect()
alert(checkMobile.message + " =====> " + checkMobile.isTrue)
shareeditdeleteflag
Dadurch wird ein iPhone auch als iPad erkannt, wenn die Gerätebreite > 750 ist.
– Roger Far
7. Januar 2020 um 14:55 Uhr
@RogerFar Ich denke, das ist weniger ein Opfer als die Kategorisierung von iBooks oder iMacs mit Touchscreen als mobile Geräte. Scheint, als ob die Leute mit diesem Problem völlig im Wald verloren sind, und da die Safari jetzt lügen kann, besteht die einzige Möglichkeit, das Problem zu lösen, darin, nach einer Funktion zu suchen, wie dies in diesem Snippet der Fall ist. Wenn Sie möchten, können Sie der Testbreite mehr Code hinzufügen und ihn nach Belieben weiter verfeinern.
Ich habe das gleiche Problem, aber ich muss auf der Serverseite nachsehen, damit ich das Menü der mobilen Seite anstelle des vollständigen Website-Menüs auf Safari iOS13 anzeigen kann. könntest du mir bitte dabei helfen? stackoverflow.com/questions/58344491/…
– Neuentwickler
13. Oktober 2019 um 2:22 Uhr
Warum musst du das wissen? Im Allgemeinen ist Browser-Sniffing eine schlechte Idee. Stattdessen sollten Sie Ihre Anwendung so schreiben, dass sie auf allen Browsern gleichermaßen funktioniert. Wenn Sie zwischen den Fähigkeiten von Browsern unterscheiden müssen, schauen Sie nach Merkmalserkennung.
– RoToRa
15. Oktober 2019 um 8:52 Uhr
OP können Sie bitte die Antwort von @kikiwora als akzeptiert markieren
– Daniel Lizik
31. Oktober 2019 um 1:48 Uhr
OP, könnten Sie die Antwort von @kikiwora als akzeptiert markieren, wenn sie Ihr Problem tatsächlich gelöst hat? Wenn nicht, teilen Sie uns bitte mit, ob Sie mit dieser Lösung auf andere Probleme gestoßen sind.
– Hermann Schachner
20. November 2019 um 13:55 Uhr