之前寫了UIWebView 使用stringByEvaluatingJavaScriptFromString 調(diào)用H5 js中寫好的function。
但是有時候這個并不能滿足跨平臺交互的各種需求尔许,這里就介紹一種webviewjavascriptbridge 第三方框架么鹤,寫的很不錯。這是它的下載鏈接WebViewJavascriptBridge
這個框架在滿足IOS 調(diào)用H5方法的同時味廊,還滿足H5方法的回調(diào)午磁,可以真正意義上實現(xiàn)UIWebView與H5的js交互。
廢話不多說毡们,上代碼迅皇。
webviewjavascriptbridge的初始化 寫完這段代碼 你的web view就和js鏈接成功了
@property WebViewJavascriptBridge* bridge;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[WebViewJavascriptBridge enableLogging];
_bridge = [WebViewJavascriptBridge bridgeForWebView:self.myWebView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"注冊橋成功數(shù)據(jù)為:%@",data);
responseCallback(@"Response from testObjcCallback");
}];
下一步,分為js調(diào)用OC 方法可以通過data給oc方法傳值衙熔,使用responseCallback將值再返回給js)和 OC調(diào)用js方法(通過data可以傳值登颓,通過response可以接受js那邊的返回值)
-->js調(diào)OC
id data = @{ @"hello world": @"This is JS!"};
[_bridge?callHandler:@"testJavascriptHandler"
data:data
responseCallback:^(id?response)?{
NSLog(@"testJavascriptHandler?responded:?%@",?response);
}];
-->OC調(diào)js 這里有兩種 一個是有返回值 一個是沒有返回值,
//有返回值
[_bridge send:@"sent ?ObjC to JS"
responseCallback:^(id?response)?{
NSLog(@"sendMessage?got?response:?%@",?response);
}];
//無返回值
[_bridge send:@"A string sent from ObjC after Webview has loaded."];
需要關(guān)注的也就這幾個方法红氯,只要根據(jù)自己需求在responseCallback做處理就ok框咙。
下面簡單介紹一下WebViewJavascriptBridge里面一些東東,WebViewJavascriptBridge的工作原理跟之前iOS UIWebView中js交互(一)中在- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType痢甘;這個方法攔截URL一樣喇嘱,WebViewJavascriptBridge也是通過web view的代理攔截url scheme,然后注入相應(yīng)的JS塞栅。
WebViewJavascriptBridge攔截的代碼在WebViewJavascriptBridge.m中
- (BOOL)webView:(UIWebView *)webViewshouldStartLoadWithRequest:(NSURLRequest *)requestnavigationType:(UIWebViewNavigationType)navigationType {
if (webView != _webView) { return YES; }
NSURL *url = [requestURL];
__strongWVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
if ([_base isCorrectProcotocolScheme:url]) {
? ? ? ? if ([_base isBridgeLoadedURL:url]) {
? ? ? ? ? ? ? ? [_base ?injectJavascriptFile];
? ? ? ? ?} else if ([_base ?isQueueMessageURL:url]) {
? ? ? ? ? ? ?NSString *messageQueueString = [self_evaluateJavascript: ? ? ? ? ? ? ?
? ? ? ? ? ? ?[_base ?webViewJavascriptFetchQueyCommand]];
? ? ? ? ? ? ?[_base ?flushMessageQueue:messageQueueString];
? ? ? ? ?} else {
? ? ? ? ? ? ? [_base logUnkownMessage:url];
? ? ? ? ?}
? ? ? ? ?return NO;
} else if (strongDelegate && [strongDelegaterespondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
return [strongDelegatewebView:webViewshouldStartLoadWithRequest:requestnavigationType:navigationType];
} else {
return YES;
}
}
通過先通過-isBridgeLoadedURL:方法判斷URL是否是需要bridge的URL者铜,若是,則通過injectJavascriptFile方法注入JS放椰;否則判斷URL是否是隊列消息作烟,若是,則執(zhí)行查詢命令JS并刷新消息隊列砾医;最后拿撩,URL被識別為未知的消息。
?個人整理總結(jié)如蚜,喜歡點贊压恒,不喜勿噴影暴,謝謝!探赫!