WKWebview相对UIWebview而言比较的人性化,因为iOS传递给js代码之后,得到的结果不一定是NSString类型,在很多情况下我们会需要得到一个对象、数组等等数据。顺便提一下一个iOS和H5之间通信的架包:JavaScriptCore.framework。这个架包是苹果自带支持的架包,主要目的就是让开发人员更加简便的去操作iOS和H5之间的通信代码。导入方式是直接从build phases中导入。
WKWebViewJavascriptBridge 能为你做什么?
你可以通过使用 WKWebViewJavascriptBridge 书写几行代码实现混合模块,而无需关心底层的 iOS 与 JS 消息传递实现。
WKWebView 原生交互原理:把 OC 的方法注册到桥梁中,让 JS 去调用。把 JS 的方法注册在桥梁中,让 OC 去调用。
通过 userContentController 把需要观察的 JS 执行函数注册起来。
然后通过一个协议方法,将所有注册过的 JS 函数执行的参数传递到此协议方法中。
1)注册 需要 观察的 JS 执行函数
[webView.configuration.userContentController addScriptMessageHandler:self name:@"jsFunc"];
2)在 JS 中调用这个函数并传递参数数据
window.webkit.messageHandlers.jsFunc.postMessage({name : "李四",age : 22});
3)OC 中遵守 WKScriptMessageHandler 协议
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {}
注意:此协议方法里的 WKScriptMessage 有 name & body 两个属性。 name 可以用来判断是哪个 JSFunc 调用了。body 则是 JSFunc 传递到 OC 的参数。
WebViewJavaScriptBridge 使用的基本步骤:
a>在项目中导入 WebViewJavaScriptBridge 框架。
pod ‘WebViewJavascriptBridge’
b>导入头文件 #import <WebViewJavascriptBridge.h> 。建立 WebViewJavaScriptBridge 和 WebView 之间的关系。
_jsBridge = [WebViewJavascriptBridge bridgeForWebView:_webView];
c>注入 JS 函数.
WeakSelf
[self.bridge registerHandler:@"navigateBack" handler:^(id data, WVJBResponseCallback responseCallback) {
// 执行回调函数
if (responseCallback) {
[weakSelf.navigationController popViewControllerAnimated:YES];
}
}];
[self.bridge registerHandler:@"navigateToMine" handler:^(id data, WVJBResponseCallback responseCallback) {
if (responseCallback) {
[weakSelf.navigationController popToRootViewControllerAnimated:YES];
}
}];
网友评论