2012-10-12 50 views
11

我已經開始爲多個平臺開發html應用程序。我最近聽說了科爾多瓦2.0(PhoneGap),自從我一直很好奇,知道這座橋如何運作。 批號行走後,我看到Exec.js是哪裏打來的JS代碼 - >本地發生phoneGap(科爾多瓦)如何在內部工作,特定於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"; 

,但要明白,是如何工作的,什麼是這裏的概念,什麼是文件: ///!gap_exec或gap://準備好了嗎?以及通話如何提供給較低層(本地代碼層)

感謝一堆提前。

回答

12

訣竅很簡單:

有一個web視圖。這顯示你的應用程序。 webview將處理所有的導航事件。

如果瀏覽器導航到:

file:///!gap_exec 

gap:// 

web視圖將取消導航。這些字符串後面的所有內容重新用作標識符,以獲得具體的插件/插件,方法和參數:

僞URL例如:

gap://echoplugin/echothistext?Hello World 

這將導致的PhoneGap尋找一個echoplugin和調用echothistext方法將文本"Hello World"發送到(本機)插件。

更新

的方式從天然回JavaScript是(或可以是)加載javascript: URL到網頁視圖。

具體實現有點複雜,因爲JavaScript必須將回調標識發送給本機代碼。可能有多個本地電話正在同時運行。但實際上這根本就不是魔術。只是一個數字來獲得正確的JSON到正確的JavaScript回調。

平臺與javascript之間有不同的溝通方式。對於Android,有三個或四個不同的網橋。

+0

我很早就想到了這件事。但你的回答是正確的。感謝 – 2ndlife

+0

如果您仍在關注科爾多瓦,您能否更新您的回覆?它看起來像exec注入一個帶有src =「gap:// ready」的iframe,這是唯一的js ...然後CDVViewController.m用shouldStartLoadWithRequest攔截所有的'gap'請求,然後CDVCommandQueue.m使用stringByEvaluatingJavaScriptFromString獲取js命令隊列。 – premiumFrye

+0

@Christian Kuetbach:你說過「可能有多個本地電話正在同時運行」。我的情況完全一樣。我需要同時調用一個本地插件方法。我還想從JavaScript插件調用傳遞來自本地插件的響應(作爲使用回調ID的插件結果)。我不確定科爾多瓦在這方面的表現如何。我爲此目的另外提出了一個問題。如果可能的話,你可以看看這個http://stackoverflow.com/q/32139534/2035845。 –

4

我想要更詳細地瞭解這一點。基本上有兩種方法在iOS端,可以幫助...

從它似乎科爾多瓦發送「READY」消息使用web視圖來源:shouldStartLoadWithRequest: ...然後用第二條消息提取結果,但我不確定。

Cordova Sources iOSExec

有很多東西需要學習那裏。

+0

我相信你是對的,看到你的回答讓我從錯誤的兔子洞裏走了很多時間。查看我對@ Christian-kuetbach上面10,000英尺透視圖的迴應 – premiumFrye

相關問題