JSBridge-分离插件js
宝哥总是说做Hybird应用开发的,这个要了解一下,那就了解一下哈哈哈哈。刚好有机会写个接入的文档,总结一下流程。
1.JSBridge
其实就是Native和Web之间通信的桥梁。
2.需求
1)引入lauch.js,根据ua判断,引入不同平台的cordova.js。
2)引入的cordova.js会根据配置文件cordova.plugin.js里的配置数据(数组),然后再动态创建script标签,引入不同的插件js。(cordova.js、cordova.plugin.js以及插件js全都会放在cdn上,根据用户配置信息载入不同的文件,变成可配置的)。
3)调用插件,文档需要标明有哪些输入与输出属性。
4)了解不同平台之间的通信方式(IOS与Android)。
####3.准备工作(这里不怎么重要。。)
1)首先,新建一个ionic1的项目
1 | sudo npm install -g cordova ionic |
2)ngCordova安装配置(也可以忽略)
其实就是多封装了一层
1 | #首先安装bower,用于安装和卸载如JavaScript、HTML、CSS之类的网络资源。 |
在www/index.html引入
并在www/js/app.js注入
3)装个相机插件
1 | #添加平台 |
4)真机调试
使用xcode安装到手机上,接着碰到一个问题导致调用插件的时候app直接闪退
解决方案,增加权限,在下面的文件以Source Code
方式打开并加这一段
1 | <key>NSCameraUsageDescription</key> |
如图:
到这里准备工作就完成了。
4.实现流程(因为cdn上传文件夹不大方便,于是我放到了自己的服务器上,直接放在了之前放图片的images目录下,忽略这个尴尬的路径名称)
1.单页应用只需要在index.html
引入lauch.js
,这个js做的事情,就是根据不同平台,引入不同的cordova.js
1 | (function($window){ 'use strict'; |
之后上传一份IOS平台引用的cordova.js
文件,地址为http://114.55.30.96/ios/cordova.js
更改index.html
,引入lauch.js
,如图:
打到真机上调试,当lauch.js
加载成功后,加载了ios平台的cordova.js
文件之后,加载cordova_plugins.js
文件的时候加载失败
那么这个cordova_plugins.js
文件是干嘛的,它是在什么时候加载?
1)首先cordova.js执行过程中,会获取了页面中所有script
标签的src
,并且找出了cordova.js
的前缀,保存前缀为pathPrefix
字段,拼接pathPrefix
+cordova_plugins.js
得到一个url
,这个url
也就是cordova_plugins.js
文件的地址
2)接着动态创建script
标签,src
设置为url
,之后把script
标签加入head
内
2.所以我又在服务器上的ios
目录下上传了cordova_plugins.js
文件
之后cordova_plugins.js
是加载成功了,但是又出现一大堆的404。
其实cordova_plugin.js
里有一个数组,里面有插件的信息,解析数组之后,会动态创建script标签,引入这些插件js,如图:
3.接着我把整个插件文件夹都放到了服务器ios目录下
重新加载应用,加载插件js成功了,可以看到index.html
审查元素变成了如图:
5.通信方式
在安装的时候默认是使用WKWebView,通过在config.xml文件中配置,这样子可以使用UIWebView
1 | <preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" /> |
IOS端:
首先在调用过程中,传递参数的时候发现会把传入的成功与失败的回调,存在一个对象内,key是一个callbackId
1)UIWebView的通信方式:
在从controller开始调用的地方进行断点,一步一步往内层调用走,发现了一个pokeNative函数,这个是轮训。从上面一张图可以看到一个commandQueue,压入了一个command数组,其实就是调用的一些信息,还有标识callbackId,原生接收到消息,就可以取得这些数据。然后通过callbackId找到对应的回调。
2)WKWebView的通信方式
command直接通过postMessage方法传入。
Android端:
重写了prompt方法
至于Android端和IOS端的处理方式,等同事上完课再补。
补充
iframe.src 和 locaiton.href:iframe.src每次都会发送请求,而location.href,连续调用会丢失一些请求。