OC与h5进行js交互(wkwebView)

为什么要进行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

初始化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))