為什么要進(jìn)行js交互?
除了js交互我們還有截取鏈接的方法,我同事說(shuō)太low了,我以前沒(méi)有接觸過(guò)js,所以也想這次好好學(xué)習(xí)下,因?yàn)檫@次的webView都是我做,這樣就可以大顯身手了。
當(dāng)我真正用了js后發(fā)現(xiàn)截取的方法確實(shí)太low了,因?yàn)槿绻麑?duì)方鏈接動(dòng)一個(gè)字母,活著我們有的地方不需要跳轉(zhuǎn),但是basewebView里面有寫(xiě)跳轉(zhuǎn),這樣可能需要兩個(gè)或者更多個(gè)webView來(lái)區(qū)別處理。但是用js交互就不一樣了,我把方法給你,你h5想跳就掉,不想跳隨意,如果有了問(wèn)題也跟我們沒(méi)關(guān)系。
js交互的方法有哪些呢?
因?yàn)橹坝肬IWebView,因?yàn)橹暗耐率怯肬IWebView集成的,所以我也做了,主要用的是系統(tǒng)的javaScriptCore,當(dāng)初他用的是webviewjavascriptbrige,這個(gè)需要h5和我們都下載第三方,因?yàn)槲覀兊闹皇菙r截跳轉(zhuǎn),比較簡(jiǎn)單,所以沒(méi)必要用,而系統(tǒng)的js的寫(xiě)法與安卓相同,用UIWebView的話系統(tǒng)的是不錯(cuò)的選擇,簡(jiǎn)單便捷,但是內(nèi)存消耗過(guò)大,我們的h5比較多,就換成了wkWebview。
這里主要寫(xiě)我在WkWebView是遇到的坑和我用到的最簡(jiǎn)單的交互寫(xiě)法,因?yàn)槟切┨嗔耍詈髸?huì)給你們比較全的地址,里面還有demo,這里制作用到的最基礎(chǔ)的總結(jié)。
基本操作方法
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];
添加監(jiān)聽(tīng)的事件
[_config.userContentController addScriptMessageHandler:self name:DISCOVERYLIST];
倒入代理方法
WKScriptMessageHandler
最后就把這個(gè)代理的一個(gè)監(jiān)聽(tīng)返回方法加進(jìn)來(lái)就行了
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
? 在這里面我們通過(guò)監(jiān)聽(tīng)的對(duì)象message.name來(lái)區(qū)分,返回的參數(shù)都在message.body里。
js端
他們只要在點(diǎn)擊方法里寫(xiě)入
window.webkit.messageHandlers.AppModel.postMessage({'body':'call js alert in js','':''});
參數(shù)可以是字典數(shù)組都可以,本人傾向于字典,明確。
注意:
當(dāng)h5不需要給我們返回參數(shù)的時(shí)候,這小括號(hào)里的大括號(hào)還是要有的,否則接收不到。我的猜測(cè)是這個(gè)監(jiān)聽(tīng)主要以傳參為主吧。
這樣最基本的交互我們就完成了,如果自己的小伙伴會(huì)發(fā)現(xiàn),運(yùn)行推出的時(shí)候沒(méi)有走dealloc,也就是這個(gè)類(lèi)沒(méi)有銷(xiāo)毀,間接說(shuō)明里面存在又循環(huán)引用,可是循環(huán)引用在哪里呢?
后來(lái)我終于排除萬(wàn)難找到了。
[_config.userContentController addScriptMessageHandler:self name:DISCOVERYLIST];
這里因?yàn)槟J(rèn)是strong的所以在js和oc在互相引用的過(guò)程中就形成的強(qiáng)引用釋放不掉。
[_config.userContentController removeScriptMessageHandlerForName:DISCOVERYLIST];
在我們徹底不需要這個(gè)方法的時(shí)候直接移除就可以了。
注意:不要在沒(méi)有基礎(chǔ)的情況下又走了添加方法,會(huì)報(bào)錯(cuò)!
我是寫(xiě)了兩個(gè)方法
-(void)addAllScriptMsgHandle;
-(void)removeAllScriptMsgHandle;
創(chuàng)建的時(shí)候加上,你需要的時(shí)候移除就可以了。
這里把我創(chuàng)建的時(shí)候參考的文獻(xiàn)(http://www.cnblogs.com/markstray/p/5757264.html?)給大家,里面的太多,簡(jiǎn)單需要的,我都給大家了。