Ich arbeite an einer App, in der ich sowohl HTML5 in UIWebView als auch das native iOS-Framework zusammen verwenden werde. Ich weiß, dass ich die Kommunikation zwischen JavaScript und Objective-C implementieren kann. Gibt es Bibliotheken, die die Implementierung dieser Kommunikation vereinfachen? Ich weiß, dass es mehrere Bibliotheken gibt, um native iOS-Apps in HTML5 und Javascript zu erstellen (zum Beispiel AppMobi, PhoneGap), aber ich bin mir nicht sicher, ob es eine Bibliothek gibt, mit der native iOS-Apps mit starker JavaScript-Nutzung erstellt werden können. Ich muss einfach:
- Führen Sie JS-Methoden von Objective-C aus
- Führen Sie Objective-C-Methoden von JS aus
- Hören Sie native JS-Ereignisse von Objective-C ab (z. B. DOM-fähiges Ereignis).
javascript
ios
html
uiwebview
andr111
quelle
quelle
Antworten:
Es gibt einige Bibliotheken, aber ich habe keine davon in großen Projekten verwendet. Vielleicht möchten Sie sie ausprobieren:
- -
Ich denke jedoch, dass es so einfach ist, dass Sie es selbst ausprobieren können. Ich persönlich habe genau das getan, als ich das tun musste. Sie können auch eine einfache Bibliothek erstellen, die Ihren Anforderungen entspricht.
1. Führen Sie JS-Methoden von Objective-C aus
Dies ist wirklich nur eine Codezeile.
Weitere Details finden Sie in der offiziellen UIWebView-Dokumentation .
2. Führen Sie Objective-C-Methoden von JS aus
Dies ist leider etwas komplexer, da unter Mac OS X nicht dieselbe windowScriptObject-Eigenschaft (und -Klasse) vorhanden ist, die eine vollständige Kommunikation zwischen beiden ermöglicht.
Sie können jedoch problemlos über benutzerdefinierte Javascript-URLs aufrufen, z.
Und fangen Sie es von Objective-C damit ab:
Dies ist nicht so sauber wie es sein sollte (oder mit windowScriptObject), aber es funktioniert.
3. Hören Sie native JS-Ereignisse von Objective-C ab (z. B. DOM-fähiges Ereignis).
Aus der obigen Erklärung geht hervor, dass Sie, wenn Sie dies tun möchten, JavaScript-Code erstellen, ihn an das zu überwachende Ereignis anhängen und den richtigen
window.location
Aufruf aufrufen müssen, der dann abgefangen werden soll.Wieder nicht sauber wie es sein sollte, aber es funktioniert.
quelle
Die vorgeschlagene Methode zum Aufrufen von Ziel c von JS in der akzeptierten Antwort wird nicht empfohlen. Ein Beispiel für Probleme: Wenn Sie zwei aufeinanderfolgende Anrufe tätigen, wird einer ignoriert (Sie können den Standort nicht zu schnell ändern).
Ich empfehle den folgenden alternativen Ansatz:
Sie rufen die
execute
Funktion wiederholt auf und da jeder Aufruf in einem eigenen Iframe ausgeführt wird, sollten sie beim schnellen Aufruf nicht ignoriert werden.Dank an diesen Kerl .
quelle
Update: Dies hat sich in iOS 8 geändert. Meine Antwort gilt für frühere Versionen.
Eine Alternative, mit der Sie möglicherweise aus dem App Store abgelehnt werden, ist die Verwendung von WebScriptObject.
Diese APIs sind unter OSX öffentlich, jedoch nicht unter iOS.
Sie müssen Schnittstellen zu den internen Klassen definieren.
Sie müssen Ihr Objekt definieren, das als WebScriptObject dienen soll
Stellen Sie nun eine Instanz auf Ihre UIWebView ein
Jetzt können Sie in Ihrem Javascript Folgendes aufrufen:
quelle
In iOS8 können Sie WKWebView anstelle von UIWebView anzeigen . Dies hat die folgende Klasse: WKScriptMessageHandler: Bietet eine Methode zum Empfangen von Nachrichten von JavaScript, die auf einer Webseite ausgeführt werden.
quelle
WKWebView
hat viele Probleme, einschließlich des nicht ordnungsgemäßen Umgangs mit Cookies. Nur eine Warnung für alle, die hierher kommen und glauben, dass sie alle Ihre Probleme lösen werden - googeln Sie ein wenig, bevor Sie sie übernehmen.Dies ist mit iOS7 möglich, Kasse http://blog.bignerdranch.com/3784-javascriptcore-and-ios-7/
quelle
Ihre beste Wahl ist das Angebot von Appcelerators Titanium. Sie haben bereits eine Obj-C-Javascript-Brücke mit der vom Webkit verwendeten
V8-EngineJavascriptCore-Engine erstellt. Es ist auch Open Source, so dass Sie es herunterladen und mit dem Obj-C basteln können, wie Sie möchten.quelle
Schauen Sie sich das KirinJS-Projekt an: Kirin JS , mit dem Javascript für die Anwendungslogik und die native Benutzeroberfläche verwendet werden kann, die der Plattform entsprechen, auf der es ausgeführt wird.
quelle
Ich habe eine Bibliothek wie WebViewJavascriptBridge erstellt, aber sie ähnelt eher JQuery, ist einfacher einzurichten und einfacher zu verwenden. Verlässt sich nicht auf jQuery (obwohl ich gewusst hätte, dass WebViewJavascriptBridge existiert, bevor ich dies geschrieben habe, hätte ich mich vor dem Eintauchen möglicherweise etwas zurückgehalten). Lass mich wissen was du denkst! Jockeyjs
quelle
Wenn Sie WKWebView unter iOS 8 verwenden, sehen Sie sich das XWebView an, mit dem die native Benutzeroberfläche automatisch Javascript ausgesetzt werden kann.
quelle