接著研究phonegap在其他平台上的實現,今日看看Windows Phone(WP)。
在WP上做JS和OS的互連比較簡單,因為內建的WebBrowser提供了比較好的與JS的互連機制,包括JS調進來和回調JS,下面先看看架構圖,和android非常類似:
下面重點談談JS與WP OS的互連
1)JS端調用WP端
WP提供了WebBrowser.ScriptNotify Event,它可以讓JS裡調用window.external.notify時,調到MainPage裡載入的WebBrowser裡ScriptNotify方法,具體可見下面的文檔:
http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.scriptnotify%28v=vs.95%29.aspx
Phonegap用PGView封裝了WebBrowser:
[html] view
plaincopy
- <Grid x:Name="LayoutRoot" Background="Transparent">
-
- <phone:WebBrowser x:Name="GapBrowser"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"
- IsScriptEnabled="True"
- Foreground="White"
- Navigated="GapBrowser_Navigated"
- Loaded="GapBrowser_Loaded"
- Unloaded="GapBrowser_Unloaded"
- ScriptNotify="GapBrowser_ScriptNotify"
- LoadCompleted="GapBrowser_LoadCompleted"
- Navigating="GapBrowser_Navigating"
- NavigationFailed="GapBrowser_NavigationFailed"
- IsGeolocationEnabled="True" />
-
- </Grid>
於是乎GapBrowser_ScriptNotify成了WP OS對JS的介面,GapBrowser_ScriptNotify裡面再通過參數動態反射相應的Command來響應各種需求
2)WP端反調JS返回結果
WP提供了webBrowser.InvokeScript,它可以從OS端調用已在WebBrowser裡載入了的JS中的方法,由於有了這個特性,大大簡化了返回調用結果的實現,不像android上還需ajax或JSONP那麼麻煩。這樣一來也不需要區分同步或非同步呼叫,統一用非同步呼叫就行了
下面看看一去一回的時序圖:
另外值得一提的是WP上沒有像android那樣通過一個plugin.xml來配置OS端邏輯的實現,而是直接通過傳進去的包名+類名來反射command類,如果是phonegap系統提供的command,就直接用類名來映射,如果是自己開發的command,則需要通過"包名.類名"來映射。
通過這兩天看phonegap在android端和wp端的實現,有點感覺它是在做苦力活,方便了別人苦了自己,為了給使用者一致的JS API,使得它需要根據各個平台對JS相容的特點,做Adapter,所以從大的架構層面上看,phonegap無太多創新可言,它的核心價值就是勤勤懇懇地處理了各個平台一些核心API調用上的差異