使用WebViewJavascriptBridge使OC跟JS进行互调
2016-06-08 11:59
447 查看
WebViewJavaScriptBridge是一个iOS/OSX 在UIWebViews/WebViews中obj-C和javascript发送消息的一个桥接
Github地址:https://github.com/marcuswestin/WebViewJavascriptBridge
问题:
在UIWebView中load前端写的xx.js文件,不会进入connectWebViewJavascriptBridge方法,导致
js调用不到oc定义的接口
xxx.js文件:
OC代码:
如上代码是没有问题的,在刚刚打开WebView的时候,第一个url开始load网页(假设网页:www.hello.com/one),可以把xxx.js的代码load完,可以运行connectWebViewJavascriptBridge函数里面的代码,也可以调用到oc定义的接口,但是如果在刚刚load的url中,点击了另一个url(假设网页:www.hello.com/two),也就是在第一个界面进入了第二个webview界面,这样的话,WebViewJavascriptBridge用的是同一个对象,不会再去执行connectWebViewJavascriptBridge函数,那么如果在第二个界面里面不会调用connectWebViewJavascriptBridge里面的代码,就代表js调用不到oc的方法,这样我们需要把第二个界面也重新的加载执行WebViewJavascriptBridge。
OC的webView代码:
表示在webViewload完一个url之后,再次执行WebViewJavascriptBridge.js文件,就可以了。
Github地址:https://github.com/marcuswestin/WebViewJavascriptBridge
问题:
在UIWebView中load前端写的xx.js文件,不会进入connectWebViewJavascriptBridge方法,导致
js调用不到oc定义的接口
xxx.js文件:
window.onerror = function(err) { log('window.onerror: ' + err) }
function connectWebViewJavascriptBridge(callback) { if (window.WebViewJavascriptBridge) { callback(WebViewJavascriptBridge) } else { document.addEventListener('WebViewJavascriptBridgeReady', function() { callback(WebViewJavascriptBridge) }, false) } }
connectWebViewJavascriptBridge(function(bridge) { bridge.init(function(message, responseCallback) { alert('进入了init方法了'); responseCallback(data) }) bridge.callHandler("hello", {}, function(data) { //data == oc返回的数据 /* 处理js的逻辑 ... */ }); })
OC代码:
self.bridge = [WebViewJavascriptBridge bridgeForWebView:wkWebView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) { NSLog(@"接收js的消息: %@", data); //响应数据给js responseCallback(@"OC传过去给js的"); }]; [_bridge send:@"test" responseCallback:^(id responseData) { NSLog(@"objc got response! %@", responseData); }]; //js获取oc传递过去的版本号,hello跟js文件对应 [self.bridge registerHandler:@"hello" handler:^(id data, WVJBResponseCallback responseCallback) { //响应数据给js responseCallback(@"hello"); }];
如上代码是没有问题的,在刚刚打开WebView的时候,第一个url开始load网页(假设网页:www.hello.com/one),可以把xxx.js的代码load完,可以运行connectWebViewJavascriptBridge函数里面的代码,也可以调用到oc定义的接口,但是如果在刚刚load的url中,点击了另一个url(假设网页:www.hello.com/two),也就是在第一个界面进入了第二个webview界面,这样的话,WebViewJavascriptBridge用的是同一个对象,不会再去执行connectWebViewJavascriptBridge函数,那么如果在第二个界面里面不会调用connectWebViewJavascriptBridge里面的代码,就代表js调用不到oc的方法,这样我们需要把第二个界面也重新的加载执行WebViewJavascriptBridge。
OC的webView代码:
-(void)webViewDidFinishLoad:(UIWebView *)webView{ if (webView != self.detailWebView) {return; } if (![[self.detailWebView stringByEvaluatingJavaScriptFromString:@"typeofWebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]){ NSString *filePath = [[NSBundle mainBundle]pathForResource:@"WebViewJavascriptBridge.js"ofType:@"txt"]; NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; [self.detailWebView stringByEvaluatingJavaScriptFromString:js]; }
表示在webViewload完一个url之后,再次执行WebViewJavascriptBridge.js文件,就可以了。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- html5 web数据存储
- 最后一次说说闭包
- Ajax
- SEO
- 2019年开发人员应该学习的8个JavaScript框架
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- HTML中的script标签研究
- 对一个分号引发的错误研究