hybrid一共分为2块内容,其中一块就是桥。
今天解析目前流行的WebViewJavascriptBridge。
WebViewJavascriptBridge在native与js端均提供了最上层的register,call接口。
js 提供了注册 js方法的方法,调用native的方法。
native提供了注册 native方法的方法,调用js的方法。
js与native都有保存了方法名(name)与方法体(method)的key value结构(main map),还有方法体中的回调方法的id(callbackid)与回调体(callbackbody)的key value结构(sub map)。
互相调用时将方法回调id(callbackid)与回调体(callbackbody)加入到本身的sub map,再通传方法名(name),方法参数(params),方法回调id(callbackid)双方在收到方法名后,到main map中寻找具体的方法体(method),执行完成后返回方法回调id(callbackid)给调用方,调用方受到方法回调id(callbackid)之后,在sub map中寻找对应的回调体(callbackbody)进行调用,以上完成一次完整的调用回调过程。
e.g.
js init:
js.register(name,method)
native init :
native.register(name,method)
====================================
js -> native:
js.call()
{
js.subMap.insert(callbackid,callbackbody)
js.frame.src({name,params,callbackid})
}
native.handle({name,params},callbackid)
{
responsedata = native.mainMap(name).do()
native.stringByEvaluatingJavaScriptFromString({callbackid,responsedata})
//此处有精彩,在底层将一个customer callback定义好抛给上层,让上层决定执行时机,而一般的callback的用法,消费者都是被动执行。
//e.g.
底层实现
-(void)receiveJSCall(name,params,callbackid)
{
method body = main map (name);
CustomerCallBack customercallback = ^(id responserData){
native.stringByEv….FromString(callbackid,responserData)
}
methodbody(params,customercallback)
}
上层实现
…
xx.register:name handle:^(id response,CustomCallBack cb)
{
responserData = do…
cg(responserData)
}
…
}
->js :
js.handle{{callbackid,responsedata}}
{
js.subMap(callbackid).do(responsedata)
}
=====================================
native -> js :
native.call()
{
native.subMap.insert(callbackid,callbackbody)
native.stringByEvaluatingJavaScriptFromString({name,params},callbackid)
}
js.handle({name,params},callbackid)
{
responsedata = js.mainMap(name).do();
js.call({callbackid,responsedata})
}
->native:
native.handle({callbackid,responsedata})
{
native.subMap(callbackid).do(responsedata)
}