Zum Teil als Übung, um ein wenig iOS-Programmierung zu lernen, und zum Teil, weil ich wünschte, ich hätte einen WhatsApp-Client auf dem iPad, versuche ich eine App zu erstellen, die ich persönlich als WhatsApp-Client für mein iPad verwenden kann. Alles was es tut, ist die web.whatsapp.com Desktop Seite in einem UIWebView wie folgt zu laden:
%Vor%Das funktioniert gut. Es lädt tatsächlich die korrekte Webanwendung, anstatt auf die WhatsApp-Homepage umzuleiten, wie es normalerweise der Fall ist, wenn der Server ein mobiles Gerät erkennt. Aber anstatt mir den QR-Code-Bildschirm für die Anmeldung zu zeigen, präsentiert er mir folgendes:
Wenn ich jetzt WhatsApp Web von Safari auf meinem iPad verwende (und die Desktop-Version anfordere), funktioniert das einwandfrei. Wie Sie sehen können, ersuche ich die Desktop-Site für mein UIWebView, indem ich den UserAgent einstelle. Nun, ich frage mich, warum es in der UIWebView nicht funktionieren würde, und ob vielleicht ein anderer Header oder Wert gesetzt werden müsste, um die App zu überzeugen, in meinem UIWebView-Steuerelement zu arbeiten?
BEARBEITEN
Ich habe WKWebView geändert, indem ich Boris Verebskys Code von Objective-C in Swift umgewandelt habe. Aber während ich zuerst den gleichen Bildschirm wie zuvor sah (sagte mir, dass ich einen anderen Browser verwenden sollte), nachdem ich ihn umgedreht und versucht habe, ihn zur Arbeit zu bringen, finde ich mich mit einem leeren weißen Bildschirm wieder. Nichts taucht mehr auf.
Dies ist mein vollständiger Code, wie er derzeit steht:
%Vor%Es kann sein, dass meine Konvertierung von Objective-C nach Swift falsch ist. Ich bin mit Objective-C nicht vertraut, das ist sehr wahrscheinlich.
Nach dem Überprüfen des User Agents überprüft Ссылка , ob der Client indexeddb unterstützt, wahrscheinlich durch JavaScript. Es ist leicht zu bemerken - wenn Sie alle Weiterleitungen verfolgen, die Ihre App durchgeführt hat, finden Sie eine Weiterleitung zu Ссылка . In meinem Fall habe ich die einfache NSURLProtocol
-Unterklasse verwendet, um alle Weiterleitungen zu protokollieren. Leider funktioniert NSURLProtocol
nicht mehr mit WKWebView
.
UIWebView
implementiert indexeddb überhaupt nicht. Soweit ich weiß, gibt es keine einfache Möglichkeit, indexeddb-Unterstützung selbst zu implementieren.
Sie können die indexeddb-Unterstützung einfach überprüfen, indem Sie auf html5test.com in UIWebView
zugreifen. Sie werden etwas wie sehen:
Aber WKWebView
unterstützt indexeddb:
Ich habe überprüft, dass web.whatsapp.com in iOS WKWebView
mit einem benutzerdefinierten Benutzeragenten geladen wurde, von meinem Desktop-Safari mit Ссылка übernommen wurde und Es zeigt QR-Code wie Sie es erwartet haben. Darüber hinaus wird die Migration auf WKWebView
einige Boni wie verbesserte Leistung und Stabilität hinzufügen.
Ich habe folgenden Code für meinen Test verwendet:
%Vor%Obwohl es Objective-C ist, sollte es ziemlich einfach sein, in swift zu konvertieren.
UPD:
Grund, warum Sie eine leere Ansicht mit WKWebView
haben, ist Transportsicherheit. Verwenden Sie entweder https://web.whatsapp.com
als URL (beachten Sie HTTPS anstelle von HTTP) oder fügen Sie NSAllowsArbitraryLoads: YES
in Ihrer Anwendung info.plist
Sie sollten wirklich zu WKWebView
wechseln und dann einfach customUserAgent
, um die gewünschte Agentenzeichenfolge direkt in der Webansicht festzulegen.