美文网首页
OC与h5进行js交互(wkwebView)

OC与h5进行js交互(wkwebView)

作者: 小玉de简书 | 来源:发表于2017-05-27 11:43 被阅读128次

    为什么要进行js交互?

    除了js交互我们还有截取链接的方法,我同事说太low了,我以前没有接触过js,所以也想这次好好学习下,因为这次的webView都是我做,这样就可以大显身手了。

    当我真正用了js后发现截取的方法确实太low了,因为如果对方链接动一个字母,活着我们有的地方不需要跳转,但是basewebView里面有写跳转,这样可能需要两个或者更多个webView来区别处理。但是用js交互就不一样了,我把方法给你,你h5想跳就掉,不想跳随意,如果有了问题也跟我们没关系。

    js交互的方法有哪些呢?

    因为之前用UIWebView,因为之前的同事是用UIWebView集成的,所以我也做了,主要用的是系统的javaScriptCore,当初他用的是webviewjavascriptbrige,这个需要h5和我们都下载第三方,因为我们的只是拦截跳转,比较简单,所以没必要用,而系统的js的写法与安卓相同,用UIWebView的话系统的是不错的选择,简单便捷,但是内存消耗过大,我们的h5比较多,就换成了wkWebview。

    这里主要写我在WkWebView是遇到的坑和我用到的最简单的交互写法,因为那些太多了,最后会给你们比较全的地址,里面还有demo,这里制作用到的最基础的总结。

    基本操作方法

    oc端

    首先我们倒入框架头文件

    #import <WebKit/WebKit.h>

    初始化wkwebView

    _config = [[WKWebViewConfiguration alloc]init];

    _config.userContentController = [[WKUserContentController alloc]init];

    _atWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:self.config];

    NSURL *url = [NSURL URLWithString:[self.webUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [_atWebView loadRequest:request];


    添加监听的事件

    [_config.userContentController addScriptMessageHandler:self name:DISCOVERYLIST];

    倒入代理方法

    WKScriptMessageHandler

    最后就把这个代理的一个监听返回方法加进来就行了

    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;

      在这里面我们通过监听的对象message.name来区分,返回的参数都在message.body里。

    js端

    他们只要在点击方法里写入

    window.webkit.messageHandlers.AppModel.postMessage({'body':'call js alert in js','':''});

    参数可以是字典数组都可以,本人倾向于字典,明确。

    注意:

    当h5不需要给我们返回参数的时候,这小括号里的大括号还是要有的,否则接收不到。我的猜测是这个监听主要以传参为主吧。

    这样最基本的交互我们就完成了,如果自己的小伙伴会发现,运行推出的时候没有走dealloc,也就是这个类没有销毁,间接说明里面存在又循环引用,可是循环引用在哪里呢?

    后来我终于排除万难找到了。

    [_config.userContentController addScriptMessageHandler:self name:DISCOVERYLIST];

    这里因为默认是strong的所以在js和oc在互相引用的过程中就形成的强引用释放不掉。

    [_config.userContentController removeScriptMessageHandlerForName:DISCOVERYLIST];

    在我们彻底不需要这个方法的时候直接移除就可以了。

    注意:不要在没有基础的情况下又走了添加方法,会报错!

    我是写了两个方法

    -(void)addAllScriptMsgHandle;

    -(void)removeAllScriptMsgHandle;

    创建的时候加上,你需要的时候移除就可以了。

    这里把我创建的时候参考的文献(http://www.cnblogs.com/markstray/p/5757264.html )给大家,里面的太多,简单需要的,我都给大家了。

    相关文章

      网友评论

          本文标题:OC与h5进行js交互(wkwebView)

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