Erkennen, wenn die Seite geladen ist innerhalb WKWebView in JavaScript
Wie kann ich zuverlässig erkennen, mit javascript eine Seite geladen wird, innerhalb einer WKWebView? Ich möchte in der Lage sein zu erkennen, diese Szenarien:
- iOS & WKWebView
- iOS & Safari
- nicht iOS
Gibt es eine ähnliche Frage über UIWebView hier. Aber es ist ziemlich alt, und ich bin mir nicht sicher, ob gleiche gilt noch für WKWebView.
InformationsquelleAutor der Frage andr111 | 2015-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie prüfen, die für die Existenz von
window.webkit.messageHandlers
die WKWebKit verwendet, um Nachrichten zu empfangen von JavaScript. Wenn es Sie gibt, sind Sie innerhalb einerWKWebView
.Kombiniert mit einer einfachen user-agent-check sollte den trick tun:
InformationsquelleAutor der Antwort Justin Michael
Die akzeptierte Antwort, die nicht funktioniert wie getestet mit WKWebView vs UIWebView app
Wie im Artikel erwähnt, nur die HTML5-feature-Unterschied ist IndexedDB unterstützen. Also ich würde gehen für eine zuverlässigere Muster mit:
Können Sie Fragen: Warum nicht mit dem UserAgent? Das ist, weil Android-Browsern verwenden Sie es als Einstellungen! So sollten wir niemals das Vertrauen einer FH. Nur die browser-Funktionen und-Eigenschaft überprüft, als solche.
Auch habe ich bemerkt, dass die
QuickTime
plugin wurde immer geladen, als Teil der Älteren Safari und andere Browser im UIWebView. Aber das plugin ist nicht mehr vorhanden WKWebView. So können Sie dieQuickTime
plugin Präsenz als eine zusätzliche Kontrolle.9/23/16 Edit: ich angepasst, den code für Safari-10, die es nicht mehr erlaubt, die Sohle idb check so zuverlässig, wie erwähnt von @xmnboy. Verwerfen Safari 10, prüft es die alte webkit-engine Fehler, die nur so lange angewendet, bis Safari 9.2; und ich benutze ein
window.statusbar.visible
fallback erscheint ein verlässlicher Indikator-signal nach ein paar Vergleichstests zwischen iOS 9 und 10. (bitte überprüfen)InformationsquelleAutor der Antwort hexalys
Angesichts der Veränderung im Verhalten der UIWebView, die eingeführt wurde, die von Apple in iOS 10, hier eine neue Antwort, das die original-Antwort von @Justin-Michael-und der follow-up-Liebling von @hexalys.
Es stellt sich heraus, dass Justin ' s Antwort war wirklich die bessere feature-detection-Mechanismus, weil es funktioniert sowohl für iOS 9 und iOS 10.
Nicht sagen, was passiert, wenn wir uns auf iOS-11. 🙂
Qualifikation: dieser test wird funktionieren, wenn Sie mit der offizielle Cordova WKWebView-plugin bauen Ihre webview-app, weil das plugin nicht initialisieren
addScriptMessageHandler
- Methode, wie bereits von @hexalys in den Kommentaren zu diesem post. Dieser Mechanismus wird von Cordova zu definieren, eine neue JS native bridgewenn die WKWebView-plugin vorhanden ist.Suche nach
addScriptMessageHandler
im das plugin repo und finden ganz am Ende dieios-wkwebview-exec.js
- Datei in das repo für einige Implementierungsdetails (oder suchen Sie nach der Zeichenfolgewindow.webkit.messageHandlers
in dieser Datei).InformationsquelleAutor der Antwort xmnboy
Es scheint, dass aufgrund der neuesten iOS-Chrome mit WKWebView als rendering-engine von Chrome erkannt wird, wie WKWebView. ua.indexOf('CriOS') !== -1 unterscheiden hilft Chrome von WKWebView im App.
InformationsquelleAutor der Antwort Chung-Hsien Chang
In iOS, Sie könnten fügen Sie diesen code, um eine Kommunikation zwischen javascript und objective-c:
...
In javascript, könntest du die Verbindung testen, wie diese:
InformationsquelleAutor der Antwort Jarir