美文网首页
WKWebView与js交互

WKWebView与js交互

作者: KobeBrant | 来源:发表于2019-08-26 09:06 被阅读0次

代码链接 https://github.com/JDyangtao/ocValueTojs

1、UIWebViewOC传值给js

  • 传值
#pragma mark - 图标H5数据交互
-(void)webViewDidStartLoad:(UIWebView *)webView
{
    self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    // 把数据传递给 JS。本质上就是让 JS 调用一个返回值的 OC 方法。
    JDWeakSelf
    self.jsContext[@"backDataToJS"] = ^{
        return weakSelf.dict;
    };
    self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
        context.exception = exceptionValue;
    };
}
  • 接收
  //这个是OC传过来的值
   var data = backDataToJS();

2、WKWebViewOC传值给js

  • 传值
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    //sendKey是和js约定的方法,我是OC是要传的值
    //NSString * jsStr = [NSString stringWithFormat:@"sendKey('%@')", @"我是OC"];
    NSString * jsStr = [NSString stringWithFormat:@"sendKey('%@','%@','%@')", @"kobe",@"123456",@"iphone 6"];
    [self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        
    }];
}
  • 接收
//js接收OC的传值,实现约定sendKey方法,name,token,device为参数
 function sendKey(name,token,device){
        document.getElementById("demo").innerHTML = token;
}

3、OC获取js点击事件

  • 遵守协议
@interface JDControlOvervView()<WKScriptMessageHandler,WKUIDelegate,WKNavigationDelegate>
@end
  • 设置代理
    self.webView.UIDelegate = self;
    self.webView.navigationDelegate = self;
    [[self.webView configuration].userContentController addScriptMessageHandler:self name:@"displayDate"];
  • 实现代理
#pragma mark - 代理方法
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    NSLog(@"==message==%@",message.body[@"name"]);
}
  • js代码
function displayDate() {
            document.getElementById("demo").innerHTML = Date();
            let dict = {"name":"123456"};
            window.webkit.messageHandlers.displayDate.postMessage(dict);
        }

4、WKWebView出现循环引用问题

  • [[self.webView configuration].userContentController addScriptMessageHandler:self name:@"displayDate"];方法出现循环用问题
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    // 因此这里要记得移除handlers
    [self.controlOverView.webView.configuration.userContentController removeScriptMessageHandlerForName:@"displayDate"];
}

相关文章

网友评论

      本文标题:WKWebView与js交互

      本文链接:https://www.haomeiwen.com/subject/fkblectx.html