phonegap源码分析(二)----Windows Phone

接着研究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:
        
        <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" />
        
   
复制代码
于是乎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调用上的差异
 
来自:http://blog.csdn.net/cutesource/article/details/7332732
posted @ 2014-03-20 11:55  huidaoli  阅读(135)  评论(0编辑  收藏  举报