混合开发之iOS快速集成DSBridge
DSBridge-IOS github:https://github.com/wendux/DSBridge-IOS
使用
Native 實現API 代理類
//JsApiTest.m
@implementation JsApiTest
//for synchronous invocation
- (NSString *) testSyn:(NSDictionary *) args
{
return [(NSString *)[args valueForKey:@"msg"] stringByAppendingString:@"[ syn call]"];
}
//for asynchronous invocation
- (NSString *) testAsyn:(NSDictionary *) args :(void (^)(NSString * _Nullable result))handler
{
handler([(NSString *)[args valueForKey:@"msg"] stringByAppendingString:@"[ asyn call]"]);
}
@end
2.注冊api代理類至DWebview
DWebview * webview=[[DWebview alloc] initWithFrame:bounds]; jsApi=[[JsApiTest alloc] init]; webview.JavascriptInterfaceObject=jsApi;
3.在Javascript中調用Native API
//Call Native API
var bridge = getJsBridge();
//Call synchronously
var str=bridge.call("testSyn", {msg: "testSyn"});
//Call asynchronously
bridge.call("testAsyn", {msg: "testAsyn"}, function (v) {
alert(v);
})
//Test will be called by oc, must be global function!
function test(arg1,arg2){
return arg1+arg2;
}
4.最后,Native中調用Javascript API
[_webview callHandler:@"test"
arguments:[[NSArray alloc] initWithObjects:@1,@"hello", nil]
completionHandler:^(NSString * value){
NSLog(@"%@",value);
}];
Javascript API 介紹
getJsBridge
獲取javascript bridge 對象;此方法為sdk內置,可在任何地方調用。
bridge.call(method,[args,callback])
功能:調用Native api
method: api函數名
args:參數,類型:json, 可選參數
callback(String returnValue): 處理調用結果的回調,僅異步調用時需要.
注意
Native API 方法簽名
為了在ios和android平臺下兼容,對IOS端Native API接口約定如下:
所有API返回值類型為NSString, 不存在時返回nil即可。
參數以JSON傳遞; DSBridge會將js參數自動轉化為NSDictionary
注:JsApiTest.m中實現的方法可以不在JsApiTest.h中聲明
調用Javascript
DWebView提供了兩個api用于調用js
//調用js api(函數)
-(void)callHandler:(NSString *)methodName arguments:(NSArray * _Nullable)args
completionHandler:(void (^)(NSString * _Nullable))completionHandler;
//執行任意js代碼
- (void)evaluateJavaScript:(NSString *)javaScriptString
completionHandler:(void (^ _Nullable)(NSString * _Nullable))completionHandler;
callHandler中,methodName 為js函數名,args為參數數組,可以接受數字、字符串等。
兩個函數中completionHandler為完成回調,用于獲取js執行的結果。
調用時機
DWebview只有在javascript context初始化成功后才能正確執行js代碼,而javascript context初始化完成的時機一般都比整個頁面加載完畢要早,隨然DSBridge能捕獲到javascript context初始化完成的時機,但是一些js api可能聲明在頁面尾部,甚至單獨的js文件中,如果在javascript context剛初始化完成就調用js api, 此時js api 可能還沒有加載,所以會失敗,為此專門提供了一個api設置一個回調,它會在頁面加載結束后調用,為了和didpagefinished區分,我們取名如下:
- (void)setJavascriptContextInitedListener:(void(^_Nullable)(void))callback;
若是端上主動調用js,請在此回調中進行 。示例如下:
__block DWebview * _webview=webview;
[webview setJavascriptContextInitedListener:^(){
[_webview callHandler:@"test"
arguments:[[NSArray alloc] initWithObjects:@1,@"hello", nil]
completionHandler:^(NSString * value){
NSLog(@"%@",value);
}];
}];
完整的示例請查看demo工程。
關于DWebview
SDK中有三個webview:
DWKwebview:繼承自WKWebView,內部已經實現js prompt、alert、confirm函數對應的對話框。
DUIwebview:繼承自UIWebView
DWebview:自定義view, 內部在ios8.0以下會使用DUIwebview, 大于等于8.0會使用DWKwebview。
所有的webview除了都實現了上述api之外,提供了一個加載網頁的便捷函數:
- (void)loadUrl: (NSString *) url;
您可以根據具體業務使用任意一個,不過一般情況下優先選用DWebview,它在新設備上更省資源,效率更高。
DWebview還提供了一些其它api和屬性,具體請查看其頭文件,需要特殊說明的是,有一個api:
- (id _Nullable) getXWebview;
它可以返回DWebview內部使用的真實webview, 值會是DUIwebview和DWKwebview的實例之一,您可以通過isKindOfClass來判斷,吃函數主要用于擴展DWebview,下面可以看一下loadRequest的大概實現:
- (void)loadRequest:(NSURLRequest *)request
{
id webview=[self getXWebview];
if([webview isKindOfClass:[DUIwebview class]]){
[(DUIwebview *)webview loadRequest:request];
}else{
[(DWKwebview *)webview loadRequest:request];
}
}
Alert dialog
DWebview已經實現 alert、prompt、comfirm對話框,您可以不做處理,也可以自定義。值得一提的是js 在調用alert函數正常情況下只要用戶沒有關閉alert對話框,js代碼是會阻塞的,但是考慮到alert 對話框只有一個確定按鈕,也就是說無論用戶關閉還是確定都不會影響js代碼流程,所以DWebview中在彈出alert對話框時會先給js返回,這樣一來js就可以繼續執行,而提示框等用戶關閉時在關閉即可。如果你就是想要阻塞的alert,可以自定義。而DWebview的prompt、comfirm實現完全符合ecma標準,都是阻塞的。
請不要手動設置DUIwebview的delegate屬性,因為DUIwebview在內部已經設置了該屬性,如果您需要自己處理頁面加載過程,請設置WebEventDelegate屬性。
總結
以上是生活随笔為你收集整理的混合开发之iOS快速集成DSBridge的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2阶节IIR算法C语言源码
- 下一篇: treeview右键添加新节点