iOS开发-原生与H5交互的正确处理方式

633 阅读1分钟

注意,使用的是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"]) {
        
        //....
    }
}