作者:粅媞em亼啡 | 来源:互联网 | 2023-07-23 17:20
接着研究phonegap在其他平台上的实现,今日看看WindowsPhone(WP)。在WP上做JS和OS的互通比较简单,因为内置的WebBrowser提供了比较好的与JS的互通机制,包括JS调进来
接着研究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:
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调用上的差异