源碼下載地址:
JS端源碼只有到npm上下載,GitHub上沒(méi)有...
DSBridge 三端易用啥的,咱就不幫作者吹了,就簡(jiǎn)單說(shuō)說(shuō)...
無(wú)空間名部分
一、初始化
JS端
//cdn
//<script src="https://cdn.jsdelivr.net/npm/dsbridge@3.1.4/dist/dsbridge.js"> //</script>
//npm
//npm install dsbridge@3.1.4
var dsBridge=require("dsbridge")
iOS端
新建一個(gè)繼承于NSObject的類(lèi),類(lèi)名如JsApiTest,對(duì)應(yīng)的JS調(diào)用原生會(huì)回調(diào)到JsApiTest中的testAsyn的函數(shù)中:
#import "dsbridge.h"
...
@implementation JsApiTest
//for synchronous invocation
- (NSString *) testSyn:(NSString *) msg
{
return [msg stringByAppendingString:@"[ syn call]"];
}
//for asynchronous invocation
- (void) testAsyn:(NSString *) msg :(JSCallback)completionHandler
{
completionHandler([msg stringByAppendingString:@" [ asyn call]"],YES);
}
@end
UIViewController
self.javascriptBridge = [[JsApiTest alloc] init];
[self.webView addJavascriptObject:self.javascriptBridge namespace:nil];
Android端
新建一個(gè)Java類(lèi),實(shí)現(xiàn)API,對(duì)應(yīng)的JS調(diào)用原生會(huì)回調(diào)到JsApiTest中的testAsyn的函數(shù)中:
public class JsApi{
//同步API
@JavascriptInterface
public String testSyn(Object msg) {
return msg + "[syn call]";
}
//異步API
@JavascriptInterface
public void testAsyn(Object msg, CompletionHandler<String> handler) {
handler.complete(msg+" [ asyn call]");
}
}
添加API類(lèi)實(shí)例到 DWebView
import wendu.dsbridge.DWebView
...
DWebView dwebView= (DWebView) findViewById(R.id.dwebview);
dwebView.addJavascriptObject(new JsApi(), null);
二、交互
JS端
// 同步
var str=dsBridge.call("testSyn","testSyn");
// 異步
dsBridge.call("testAsyn","testAsyn", function (v) {
alert(v);
})
OC端
[dwebview callHandler:@"testAsyn" arguments:@[@3,@4] completionHandler:^(NSNumber* value){
NSLog(@"%@",value);
}];
Android端
dwebView.callHandler("testAsyn",new Object[]{3,4},new OnReturnValue<Integer>(){
@Override
public void onValue(Integer retValue) {
Log.d("jsbridge","call succeed,return value is "+retValue);
}
});
三、說(shuō)明
JS中的異步方法dsBridge.call("testSyn","testSyn");其中連續(xù)兩個(gè)testSyn參數(shù),所代表的意思是不同的,第一個(gè)參數(shù)testSyn是指移動(dòng)端所實(shí)現(xiàn)的函數(shù)方法名,例如OC的是通過(guò)objc_msgSend指定到JsApiTest類(lèi)中的- (void) testAsyn:(NSString *) msg :(JSCallback)completionHandler。
- (void) testAsyn:(NSString *) msg :(JSCallback)completionHandler 如果在JS調(diào)用原生的時(shí)候,需要有回調(diào)的時(shí)候可以直接completionHandler回去,如果不需要?jiǎng)t無(wú)需completionHandler。
空間名部分
命名空間可以幫助你更好的管理API,這在API數(shù)量多的時(shí)候非常實(shí)用,比如在混合應(yīng)用中。DSBridge (>= v3.0.0) 支持你通過(guò)命名空間將API分類(lèi)管理,并且命名空間支持多級(jí)的,不同級(jí)之間只需用'.' 分隔即可。(復(fù)制dsbridge文檔,筆者表示復(fù)制粘貼解決一切...)
初始化
JS端
初始化與無(wú)空間名一致
OC端
在UIViewController 中
UIViewController,注冊(cè)JavascriptObject時(shí)寫(xiě)上三端協(xié)商好的空間名。
self.javascriptBridge = [[JsApiTest alloc] init];
[self.webView addJavascriptObject:self.javascriptBridge namespace:@"namespace"];
Android端
類(lèi)似iOS端在注冊(cè)JavascriptObject時(shí)寫(xiě)上三端協(xié)商好的空間名。
交互
JS端
dsBridge.call("namespace.nativeMethod",{action:"getSourceSign",data:"1111"},function (ret) {
alert(JSON.stringify(ret));
})
OC端
與無(wú)空間的實(shí)現(xiàn)一致。
Android端
與無(wú)空間的實(shí)現(xiàn)一致。
說(shuō)明
主要是JS端的區(qū)別由原本兩個(gè)參數(shù)分別代表原生端的函數(shù)名、交互協(xié)議名,變?yōu)?code>namespace.naviteMethod,另外攜帶的交互message上差不多,看各自的約定哈。
結(jié)語(yǔ)
大概就講這些,別的自己看文檔,下載demo查看哈。這邊就大概簡(jiǎn)單的說(shuō)一下下...