WKWebView JS 交互
客戶端中加入以下代碼 可以監(jiān)聽JS->OC
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
[configuration.userContentController addScriptMessageHandler:self name:@"abc"];
//發(fā)送的信息僅支持字符串
window.webkit.messageHandlers.abc.postMessage("你好") ;
當(dāng)在頁面中調(diào)用 以上JS代碼后 在 delegate 中接受到數(shù)據(jù)
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"abc"]) {
NSLog(@" %@",message.body);
}
}
//移除Handler
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"abc"];
重點(diǎn)
在這里的Controller 退出的時(shí)候dealloc ,并不會執(zhí)行娱仔。 WKScriptMessageHandler,會有內(nèi)存泄漏的Bug食听,
目前的解決方式 新建一個(gè)對象實(shí)現(xiàn)上述代理淌实。
@interface WeakMessageHandler : NSObject <WKScriptMessageHandler>
@property (nullable, nonatomic, weak)id <WKScriptMessageHandler> delegate; //重點(diǎn)
-(instancetype)initWithMessageHandler:(id<WKScriptMessageHandler>) delegate ;
@end
-(instancetype)initWithMessageHandler:(id<WKScriptMessageHandler>)delegate {
if (self = [super init]) {
_delegate = delegate;
}
return self;
}
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if (self.delegate && [self.delegate respondsToSelector:@selector(userContentController:didReceiveScriptMessage:)]) {
[self.delegate userContentController:userContentController didReceiveScriptMessage:message];
}
}
即可解決內(nèi)存泄漏的問題
OC->JS
[self.webView evaluateJavaScript:@"方法" completionHandler:nil]