注意,使用的是WKWebView
1.原生调用H5的JS方法
比较简单,直接调用WebKit的APIevaluateJavaScript
// 调用JS 方法xxx
[self.webView evaluateJavaScript:"xxx" completionHandler:^(id _Nullable response, NSError * _Nullable error) {
// ...
}];
2.H5调用原生方法
这个场景,会形成循环引用。重点:必须注意的是如何解决循环引用问题。
首先,遵循协议<WKScriptMessageHandler>,监听H5方法
- 监听JS方法
[self.webView.configuration.userContentController addScriptMessageHandler:weakself name:@"xxxxx"];
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// 在此注册,监听h5方法。因为移除是在 viewWillDisappear方法进行,对应
[self addScriptMessageHandlers];
}
- 移除监听
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"xxxxx"];
本方案中,移除的时机是,viewWillDisappear
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
// 移除监听,防止循环引用
[self removeScriptMessageHandlers];
}
- 回调处理
#pragma mark - WKScriptMessageHandler
// JS交互
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
// H5调用原生,回调 处理
if ([message.name isEqualToString:@"xxxxx"]) {
//....
}
}