代碼demo已在Github開源,MXJSMessageHandler
如果能幫助到您,可以點(diǎn)個星star哈,謝謝!
MXJSMessageHandler
MXJSMessageHandler solves that WKWebView has always retained(id<WKScriptMessageHandler> scriptMessageHandler, scriptMessageHandler may be a controller.
解決了WKWebView的scriptMessageHandler有時候會是controller本身的問題,導(dǎo)致循環(huán)引用,內(nèi)存泄漏的問題
Screenshot

image.png
How to use
原生注入js方法callNativeMethod(內(nèi)部再調(diào)用原生的方法test)
NSString *jsMethodName = @"callNativeMethod", *nativeMethodName = @"test";
// 1. 注入`js`方法`callNativeMethod(內(nèi)部再調(diào)用原生的方法`test`)`
NSString *jsScript = [NSString stringWithFormat:@"\
function %@(data) {\
window.webkit.messageHandlers.%@.postMessage(data)\
}", jsMethodName, nativeMethodName];
[_webView mx_addUserScript:[[WKUserScript alloc] initWithSource:jsScript injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES]];
原生調(diào)用js方法callNativeMethod,延時1S是保證讓js方法調(diào)用成功(不為undefine)
// 2. 原生調(diào)用js方法`callNativeMethod`,延時1S是保證讓`js方法調(diào)用成功(不為undefine)`
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[_webView evaluateJavaScript:[NSString stringWithFormat:@"%@(\"%@\")", jsMethodName, @"data: js to oc"] completionHandler:^(id data, NSError *error) {}];
});
監(jiān)聽js調(diào)用原生方法test的block
// 3. 監(jiān)聽`js`調(diào)用原生方法`test`的`block`
__weak __typeof(self) weakself = self;
[_webView mx_addScriptMessageHandler:[MXJSMessageHandler handlerWithBlock:^(WKUserContentController *userContentController, WKScriptMessage *message) {
if ([message.body isKindOfClass:[NSString class]]) {
NSString *data = message.body;
[weakself showData:data];
}
}] name:nativeMethodName];