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"}
上一篇下一篇

猜你喜欢

热点阅读