MXJSMessageHandler 解決了WKWebView的`scriptMessageHandler`有時候會是controller本身的問題,導(dǎo)致循環(huán)引用,內(nèi)存泄漏的問題

代碼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];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容