当前位置 : 主页 > 手机开发 > 其它 >

WebViewJavascriptBridge 解析

来源:互联网 收集:自由互联 发布时间:2021-06-12
hybrid一共分为2块内容,其中一块就是桥。 今天解析目前流行的WebViewJavascriptBridge。 WebViewJavascriptBridge在native与js端均提供了最上层的register,call接口。 js 提供了注册 js方法的方法,调用

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)

}

网友评论