phonegap002

今日看看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:

<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调用上的差异

猜你喜欢

转载自fangyong2006.iteye.com/blog/1976510
002