DSBridge-IOS github:https://github.com/wendux/DSBridge-IOSjavascript
Native 實現API 代理類java
//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代理類至DWebviewandroid
DWebview * webview=[[DWebview alloc] initWithFrame:bounds]; jsApi=[[JsApiTest alloc] init]; webview.JavascriptInterfaceObject=jsApi;
3.在Javascript中調用Native APIios
//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 APIgit
[_webview callHandler:@"test" arguments:[[NSArray alloc] initWithObjects:@1,@"hello", nil] completionHandler:^(NSString * value){ NSLog(@"%@",value); }];
獲取javascript bridge 對象;此方法爲sdk內置,可在任何地方調用。github
功能:調用Native apiweb
method: api函數名json
args:參數,類型:json, 可選參數api
callback(String returnValue): 處理調用結果的回調,僅異步調用時須要.數組
爲了在ios和android平臺下兼容,對IOS端Native API接口約定以下:
注:JsApiTest.m中實現的方法能夠不在JsApiTest.h中聲明
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工程。
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]; } }
DWebview已經實現 alert、prompt、comfirm對話框,您能夠不作處理,也能夠自定義。值得一提的是js 在調用alert函數正常狀況下只要用戶沒有關閉alert對話框,js代碼是會阻塞的,可是考慮到alert 對話框只有一個肯定按鈕,也就是說不管用戶關閉仍是肯定都不會影響js代碼流程,因此DWebview中在彈出alert對話框時會先給js返回,這樣一來js就能夠繼續執行,而提示框等用戶關閉時在關閉便可。若是你就是想要阻塞的alert,能夠自定義。而DWebview的prompt、comfirm實現徹底符合ecma標準,都是阻塞的。
請不要手動設置DUIwebview的delegate屬性,由於DUIwebview在內部已經設置了該屬性,若是您須要本身處理頁面加載過程,請設置WebEventDelegate屬性。