为什么要进行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 )给大家,里面的太多,简单需要的,我都给大家了。