美文网首页
WKWebView与JS交互内存不释放问题探究

WKWebView与JS交互内存不释放问题探究

作者: 书写不简单 | 来源:发表于2018-12-24 09:46 被阅读0次

    最近在做一个项目,里面用到了与H5的交互,准确的说是JS端要调用本地的代码,这里要说一下,wkWebView的JS交互与普通的UIWebView是不一样的,而且在JS端代码的编写也是有所不同的,希望大家能跟后台人员做良好的沟通。 废话不多说,直接上代码。。。。

    • 先说说wkWebView与JS交互的方法吧
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    
    [config.userContentController addScriptMessageHandler:self name:@"与后台约定的方法名"];
    
    //创建webView
    
    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];
    
    webView.navigationDelegate = self;
    

    在上面的这个方法里面去创建一个webView,并且约定方法名称。

    执行本地的方法时候调用下面的这个方法

    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    //message.body 可以打印JS端给你传过来的数据,可以根据数据去执行相应的方法
    }
    

    你以为JS调用本地的方法就完事了吗?

    错误,你会发现这样调用方法之后,内存根本不释放。也就是说dealloc方法不会执行。

    前方高能,请仔细查看。。。。

    问题就出现在

    [config.userContentController addScriptMessageHandler:self name:@"与后台约定的方法名"];
    

    这句代码上面,准确的说是“self”的身上。

    那么怎么解决呢?

    我们可以把self换掉,就是说用其他换掉self,这里面就要新建一个类

    在.h里面是这样的

    #import <WebKit/WebKit.h>
    
    @interface XLWeakScriptMessageDelegate : NSObject<WKScriptMessageHandler>
    
    
    @property (nonatomic,weak)id<WKScriptMessageHandler> scriptDelegate;
    
    - (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate;
    
    @end
    

    在.m里面是这样的

    #import "XLWeakScriptMessageDelegate.h"
    
    @implementation XLWeakScriptMessageDelegate
    
    - (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate{
        self = [super init];
        if (self) {
            _scriptDelegate = scriptDelegate;
        }
        return self;
    }
    
    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
        [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message];
    }
    
    @end
    

    新建的类我都写在这里了,大家可以拿过去直接用。
    下面说的是最重要的改动,就是把

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    
    [config.userContentController addScriptMessageHandler:self name:@"与后台约定的方法名"];
    

    这里面的代码改造成

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
        [config.userContentController addScriptMessageHandler:[[XLWeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"callback"];
        //创建webView
        WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];
        webView.navigationDelegate = self;
    

    本文转载:文章;

    相关文章

      网友评论

          本文标题:WKWebView与JS交互内存不释放问题探究

          本文链接:https://www.haomeiwen.com/subject/dhsakqtx.html