WKWebView 与 JS的交互
2019-05-16 本文已影响0人
叫我魏大川
使用WKWebView时与JS的交互问题记录。
一:JS主动传值给WK
JS端:
/* 一个抽象模型 */
window.webkit.messageHandlers.
<name>.postMessage(<messageBody>)
/* 具体实例 */
/*JS的传出语句如下,那么name = "xxxxx"*/
window.webKit.messagehandlers. xxxxx.postMessage("ooooo")
WK端:
/*外部要想获得上面的信息则进行如下监听*/
[self.webView.configuration.userContentController addScriptMessageHandler:self name:@"xxxxx"];
遵循WKScriptMessageHandler,实现
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
if([message.name isEqualToString:@"xxxxx"])
{
NSLog(@"收到js调用请求!");
/*获得传出的字符串参数,即"ooooo"*/
NSLog(@"%@", message.body);
}
}
这里有一点需要注意,就是传入的参数是_ _NSCFString类型的,需要根据需要转为nsstring,再转换成字典等。
二:WK主动传值给JS
NSString * jsStr = [NSString stringWithFormat:@"JS里的方法名('%@')",携带的参数]];
[self.hView.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
if(error)
NSLog(@" error %@", error);
else
NSLog(@"成功! %@",result);
}];
三:JS想要随时调取WK,并获取WK方的一些信息,怎么办呢?就是上面两个方法的结合。wk监听到JS调用的方法,然后WK主动调用协商好的方法传进参数即可。
四:别忘了最后在dealloc里移除监听
[[self.hView.webView configuration].userContentController removeScriptMessageHandlerForName: @"xxxxx"}