2012-10-12 9 views
11

Ich habe begonnen, HTML-Anwendungen für mehrere Plattformen zu entwickeln. Ich habe kürzlich von Cordova 2.0 (PhoneGap) gehört und seither bin ich gespannt, wie die Brücke funktioniert. Nach viel Code zu Fuß, sah ich, dass die Exec.js der Code in dem Aufruf von JS -> NativeWie funktioniert phoneGap (Cordova) intern, iOS spezifische

execXhr = execXhr || new XMLHttpRequest(); 
     // Changeing this to a GET will make the XHR reach the URIProtocol on 4.2. 
     // For some reason it still doesn't work though... 
     execXhr.open('HEAD', "file:///!gap_exec", true); 
     execXhr.setRequestHeader('vc', cordova.iOSVCAddr); 
     if (shouldBundleCommandJson()) { 
      execXhr.setRequestHeader('cmds', nativecomm()); 
     } 
     execXhr.send(null); 
    } else { 
     execIframe = execIframe || createExecIframe(); 
     execIframe.src = "gap://ready"; 

Aber wollen verstehen, geschieht, wie das funktioniert, was das Konzept hier ist, was Datei tut: ///! gap_exec oder gap: // ready do? und wie ruft der Anruf zu den unteren Schichten (native Codeschichten)

dank ein Bündel im Voraus ab.

Antwort

12

Der Trick ist einfach:

Es gibt ein Webview. Dies zeigt Ihre App an. Die Webansicht behandelt alle Navigationsereignisse.

Wenn der Browser navigiert zu:

file:///!gap_exec 

oder

gap:// 

der Webansicht die Navigation abzubrechen. Alles hinter diesen Saiten wird wiederverwendet als eine Kennung, die konkrete plugin/plugin-Methode und Parameter zu erhalten:

pseudo-URL Beispiel:

gap://echoplugin/echothistext?Hello World 

Diese phonegap verursachen ein echoplugin zu suchen und Rufen Sie die echothistext Methode auf, um den Text "Hello World" an das (native) Plugin zu senden.

Update

Der Weg von nativen zurück zu Javascript ist (oder sein kann) eine javascript: URL in die Webansicht zu laden.

Die konkrete Implementierung ist ein bisschen komplexer, weil das Javascript eine Callback-ID an nativen Code senden muss. Es können mehrere native Anrufe gleichzeitig ausgeführt werden. Aber das ist überhaupt keine Magie. Nur eine Nummer, um den richtigen JSON zum richtigen Javascript-Callback zu bekommen.

Es gibt verschiedene Möglichkeiten, zwischen der Plattform und Javascript zu kommunizieren. Für Android gibt es drei oder vier verschiedene Brücken.

+0

Ich habe diese lange Zeit zurück herausgefunden. Aber deine Antwort ist richtig. Danke – 2ndlife

+0

könnten Sie Ihre Antwort aktualisieren, wenn Sie Cordova noch folgen? Es sieht so aus, als ob exec ein iframe mit src = "gap: // ready" eingibt und das ist die einzige js ... dann fängt CDVViewController.m alle Anfragen mit 'lapseStartLoadWithRequest' ab, dann verwendet CDVCommandQueue.m die stringByEvaluatingJavaScriptFromString um die js Befehlswarteschlange zu holen . – premiumFrye

+0

@Christian Kuetbach: Du hast gesagt "Es könnte mehr als einen nativen Anruf gleichzeitig geben". Meine Situation ist genau dieselbe. Ich muss eine native Plugin-Methode mehr als einmal gleichzeitig aufrufen. Ich möchte auch eine Antwort von nativem Plugin (als Plugin-Ergebnis mit Rückruf-ID) für jeden Plugin-Aufruf von JavaScript übergeben. Ich bin mir nicht sicher, wie sich Cordova in diesem Zusammenhang verhält. Ich habe zu diesem Zweck eine gesonderte Frage gestellt. Wenn möglich, könnten Sie bitte in diese http://stackoverflow.com/q/32139534/2035845 schauen. –

4

Ich versuche, das auch im Detail herauszufinden. Grundsätzlich gibt es zwei Methoden auf der iOS-Seite, die helfen kann ...

Aus den Quellen scheint es cordova sendet eine Meldung „BEREIT“ mit WebView: should: ... und nimmt dann die Ergebnisse mit der zweiten Nachricht auf, aber ich bin mir nicht sicher.

Cordova Sources iOSExec

Es gibt viel dort zu lernen.

+0

Ich glaube, du hast Recht, und deine Antwort hat mich davor bewahrt, zu viele Stunden in das falsche Kaninchenloch zu gehen. Sehen Sie sich meine Antwort auf @ Christian-kuetbach oben für eine 10.000 ft Perspektive an – premiumFrye

Verwandte Themen