一、js與native交互流程
舉例說明:
window.JSBridgeEventHandler.callNativeFunction('propose',"hello native束亏,你好",'proposeCallback',onNotify);
native將執(zhí)行propose方法铃在,并收到傳來的"hello native,你好"碍遍,并通過window.dispatchEvent('proposeCallback')涌穆,通過js的onNotify方法得到調(diào)用。
二雀久、具體的業(yè)務(wù)代碼實現(xiàn)
1.安卓、iOS注冊js調(diào)用函數(shù)代碼
根據(jù)url攔截的方式監(jiān)聽js發(fā)來的消息:
iOS注冊js傳來的消息監(jiān)聽:
2趁舀、js端bridge代碼
2赖捌、js調(diào)用Native代碼
三、js調(diào)用native的兩種方式對比
對比 | 調(diào)用native暴露的api方式 | 通過攔截url的方式調(diào)用native |
---|---|---|
優(yōu)點 | a.安卓和iOS可以實現(xiàn)同步調(diào)用native暴露的方法矮烹,iOS實現(xiàn)難度更高越庇,安卓原生支持; 2.對前端開發(fā)而言api更友好 |
不需要考慮系統(tǒng)兼容性奉狈,任意安卓和iOS系統(tǒng)都天然支持卤唉,不需要考慮安卓版本問題、iOS的UIWebView和WKWebView的適配問題 |
缺點 | 如果不考慮實現(xiàn)同步調(diào)用native的方法仁期,取得返回值的話桑驱,建議采用封裝一層調(diào)用native的js對象的方式竭恬,以實現(xiàn)更好的api友好性; | api不夠友好熬的,要拼接特定scheme痊硕、host、params的組件給native |
四押框、微信jsBridge實現(xiàn)方式分析;
1.微信jsBridge調(diào)用流程
2.微信jsbridge的實現(xiàn)
經(jīng)逆向微信app的實現(xiàn)岔绸,對點擊js button,調(diào)用wx.onMenuShareWeibo橡伞,會呼起一個UIWindow對象盒揉,對該對象的initWithFrame進(jìn)行斷點,得出完整的調(diào)用堆棧兑徘,可以得出是調(diào)用了webkit的userContentController:didReceiveScriptMessage:,而不是采用攔截特定scheme請求的方式實現(xiàn)的jsbridge刚盈。
類似封裝如下:
window.wx = {
config: function (appid, timestamp, noncestr, queryApi) {
},
onMenuShareWeibo:function(obj){
//根據(jù)obj.success,obj.fail等function,取得md5,生成回調(diào)事件名道媚。
if (this.isIOS) {
message = {'methodName': obj.showMenu, 'title': obj.title,'callBackName':callBackName};
if (callBackName) {
window.addEventListener(callBackName, callBack);
}
window.webkit.messageHandlers.JSBridgeEventHandler.postMessage(message);
}
if (this.isAndroid) {
var v = eval('window.Bridge.' + methodName + '(' + JSON.stringify(params) + ');');
var e=new Event(callBackName);
e.msg = v;
callBack(e);
}
}
}
3.微信簽名認(rèn)證的原理
核心在于客戶端與服務(wù)器約定了一個相同的ticket扁掸,因為ticket第三方未知,根據(jù)相同的ticket最域,timestmap谴分,noncestr,相同的規(guī)則一定能得出相同的sha1簽名值镀脂,而timestmap和noncestr牺蹄,又增加了隨機(jī)性,被破解的可能性很小薄翅。<br
同時沙兰,繞過了私鑰簽名的過程,采用了更簡便的方式實現(xiàn)了雙向認(rèn)證翘魄。即微信認(rèn)證調(diào)用方是已注冊的調(diào)用方鼎天,同時app也可以對微信進(jìn)行認(rèn)證,認(rèn)證發(fā)來的請求是由微信發(fā)出暑竟。
簡單易用斋射,又具有很高的安全性;