DSBridge是目前地球上使用最簡單並且支援同步呼叫的跨平臺(IOS/Android)javascript bridge(native和js的橋樑),DSBridge 2.0更新之後,支援了“native多次返回”,極大的方便了js呼叫native方法時,natvie需要多次向js返回資料的場景。
先貼出DSBridge github地址
DSBridge-IOS:github.com/wendux/DSBr…
DSBridge-Android:[github.com/wendux/DSBr…
“多次返回”是什麼?
通常情況下,呼叫一個方法結束後會返回一個結果,是一一對應的,現在,我們來思考如下場景:
有一個嵌入到app中顯示文件下載列表的網頁。要求點選網頁中相應檔案對應的下載按鈕後,開始下載檔案,並在該檔案顯示項的底部顯示下載進度。
思考:我們將檔案下載的功能在natvie端實現,當點選網頁上的某項時,我們通過js呼叫native的下載方法,native在下載的過程中,不斷的向js返回進度, 然後js更新網頁上的進度條,等到下載任務結束時,才算本次呼叫結束。而這種呼叫的特徵就是js的一次呼叫,對應native的“多次返回”,考慮到native很多耗時任務都可能會多次返回(比如返回進度),DSBridge 2.0對“多次返回”進行了支援,使用DSBridge 就可以非常方便的應對這種case了了。
示例
我們來模擬一個呼叫計時器的功能:
Native:提供一個倒數計時的API, 命名為callProgress, 它的功能是起動一個計時器,倒數計時10秒,每過一秒向js輸出剩餘的時間。
JS: 呼叫native提供的倒數計時API,將剩餘時間(秒)更新到網頁。
我們看看點選後的效果:
Web端:
<div class="btn" onclick="callProgress()">多次回撥 <span id=`progress`></span></div>
function callProgress(){
//呼叫Native提供的callProgress
dsBridge.call("callProgress", function (value) {
//顯示剩餘的時間
document.getElementById("progress").innerText=value
})
}複製程式碼
Natvie端:
Android
@JavascriptInterface
public void callProgress(JSONObject jsonObject, final CompletionHandler handler) throws JSONException {
new CountDownTimer(11000, 1000) {
int i=10;
@Override
public void onTick(long millisUntilFinished) {
// 返回剩餘的時間,會多次呼叫
handler.setProgressData((i--)+"");
}
@Override
public void onFinish() {
//結束呼叫
handler.complete("");
}
}.start();
}複製程式碼
注:setProgressData可以多次呼叫,每呼叫一次,js端就會收到一次資料。complete呼叫之後則代表本次呼叫結束,handler將失效,呼叫complete之後將不能再呼叫setProgressData。
IOS
//下面程式碼中value、handler為全域性變數
- ( void )callProgress:(NSDictionary *) args :(void (^)(NSString * _Nullable result,BOOL complete))completionHandler
{
value=10;
//儲存handler
hanlder=completionHandler;
//起動計時器
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];
}
-(void)onTimer:t{
if(value!=-1){
//返回剩餘的時間,可多次呼叫
hanlder([NSString stringWithFormat:@"%d",value--],NO);
}else{
//結束呼叫
hanlder(@"",YES);
[timer invalidate];
}
}
...複製程式碼
注:
handler(NSString * _Nullable result,BOOL complete)
result: 返回給js的資料。
complete:表示呼叫是否結束;complete為YES, 呼叫之後則代表本次呼叫結束,handler將失效。
完整的示例請參考DSBridge自帶的demo:
DSBridge-IOS:github.com/wendux/DSBr…
DSBridge-Android:github.com/wendux/DSBr…
最後
如果你喜歡DSBridge , 歡迎star!