2012-10-12 2 views
11

複数のプラットフォーム用のhtmlアプリケーションの開発を開始しました。私は最近、Cordova 2.0(PhoneGap)について聞いたことがあり、橋の仕組みを知りたいと思って以来、 :>ネイティブphoneGap(Cordova)は内部でどのように動作するのですか、iOS固有のもの

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"; 

起こるしかし、それがどのように機能するかを理解したい、ファイルを何、ここでのコンセプト何である - コード歩行の多くの後、私はExec.jsはJSから呼び出しがコードであることを見ました///!gap_execまたはgap:// ready do?その呼び出しが下位層(ネイティブコード層)にどのように伝わるのかを示します。

ありがとうございます。

答えて

12

トリックは簡単です:

webviewがあります。これはあなたのアプリを表示します。 webviewはすべてのナビゲーションイベントを処理します。

ブラウザはに移動した場合:

file:///!gap_exec 

または

gap:// 

WebViewのナビゲーションをキャンセルさせていただきます。これらの文字列の後ろのすべてが、具体的なプラグイン/プラグイン方式とパラメータを取得するには、識別子として再利用されます。

疑似URL例:これは、PhoneGapのはechopluginを探すことになります

gap://echoplugin/echothistext?Hello World 

echothistextメソッドを呼び出して、"Hello World"というテキストを(ネイティブ)プラグインに送信します。 WebViewのにjavascript: URLをロード

更新

バックネイティブからJavaScriptに方法がある(またはであってもよいです)。

javascriptがネイティブコードにコールバックIDを送信する必要があるため、具体的な実装は少し複雑です。同時に複数のネイティブコールが実行されている可能性があります。しかし、実際これはまったく魔法ではありません。右のjavascript-callbackに正しいJSONを取得するための番号です。

プラットフォームとjavascript間の通信にはさまざまな方法があります。 Androidの場合、3つまたは4つの異なるブリッジがあります。

+0

私はこれを長い時間のうちに考え出しました。しかし、あなたの答えは正しいです。ありがとうございました – 2ndlife

+0

あなたはまだコードバに従っているなら、あなたの応答を更新できますか?それはexecがsrc = "gap:// ready"でiframeを注入するように見えます。それは唯一のjsです。次にCDVViewController.mはshouldStartLoadWithRequestで 'gap'へのすべてのリクエストをインターセプトし、CDVCommandQueue.mはstringByEvaluatingJavaScriptFromStringを使用してjsコマンドキューを取得します。 – premiumFrye

+0

@Christian Kuetbach:「複数のネイティブコールが同時に実行される可能性があります」のように言った。私の状況はまったく同じです。 1つのネイティブプラグインメソッドを複数回同時に呼び出す必要があります。また、JavaScriptからのプラグイン呼び出しごとにネイティブプラグインからの応答(コールバックIDを使用したプラグイン結果として)を渡したいと思います。私はこの文脈でコルドバがどのように行動するのか分かりません。私はこの目的のために別の質問をしました。可能であれば、このhttp://stackoverflow.com/q/32139534/2035845をご覧ください。 –

4

私はこれについてさらに詳しく説明しようとしています。基本的に助けることができるのiOS側の2つの方法...

がありますshouldStartLoadWithRequest: ...そして2番目のメッセージで結果を取り上げますが、わかりません。

Cordova Sources iOSExec

が学ぶことはたくさんあります。

+0

私はあなたが正しいと信じて、あなたの答えを見て間違ったウサギの穴をあまりにも多くの時間を下って行くのを助けました。上記の@ Christian-kuetbachへの私の反応を10,000フィートのパースペクティブでチェックしてください – premiumFrye

関連する問題