WKWebview和iOS交互篇
##iOS调用js
在UIWebview的时候使用JSContext来进行js通信,在WKWebview的时候,没有JSContext了,但是Apple提供了新的方法evaluateScript,使用起来更便捷。
[self.webview evaluateJavaScript:@"document.title" completionHandler:^(id _Nullable title, NSError * _Nullable error) {
NSLog(@"title: %@", title);
}];
NSString *jsData = @"传递给h5的数据";
NSString *jsStr = [NSString stringWithFormat:@"setJSData('%@')", jsData];
[self.webview evaluateJavaScript:jsStr completionHandler:^(id _Nullable info, NSError * _Nullable error) {
//js设置成功
}];
- 通过evaluateScript的方式,可以直接使用js如:document.title来获取html的title。
- 使用自定义的方法setJSData来处理。
上述通过setJSData的方式需要js端进行接收
var js_data;
window.setJSData= function(obj){
js_data = obj;
};
##js调用iOS
同样在UIWebview的时候使用JSContext来进行js通信,在WKWebview的时候,没有JSContext了,但是Apple提供了新的方法WKScriptMessageHandler。
js代码:
var message = {
'method' : 'updateData',
'params' : 'dataStr',
};
window.webkit.messageHandlers.AWCall.postMessage(message);
///设置message.name
_userContent = [[WKUserContentController alloc] init];
[_userContent addScriptMessageHandler:self name:@"AWCall"];
//实现代理
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"JS 调用了 %@ 方法,传回参数 %@", message.name,message.body);
NSLog(@"方法名:%@", message.name);
NSLog(@"参数:%@", message.body);
if ([message.name isEqualToString:@"AWCall"]) {
}
}