DSBridge的簡(jiǎn)說(shuō)

源碼下載地址:

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ō)一下下...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容