OC與h5進(jìn)行js交互(wkwebView)

為什么要進(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)單需要的,我都給大家了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 上一篇專(zhuān)門(mén)講解了WKWebView相關(guān)的所有類(lèi)、代理的所有API。前篇文章地址:http://blog.cs...
    iwolfox閱讀 1,241評(píng)論 1 1
  • 前言 關(guān)于UIWebView的介紹,相信看過(guò)上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問(wèn)題,歡迎提問(wèn)。 本文是本系列...
    Dark_Angel閱讀 29,526評(píng)論 67 291
  • 前言 關(guān)于UIWebView的介紹,相信看過(guò)上文的小伙伴們,已經(jīng)大概清楚了吧,如果有問(wèn)題,歡迎提問(wèn)。 本文是本系列...
    CoderLF閱讀 9,368評(píng)論 2 12
  • 隨著H5技術(shù)的興起,在iOS開(kāi)發(fā)過(guò)程中,難免會(huì)遇到原生應(yīng)用需要和H5頁(yè)面交互的問(wèn)題。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,246評(píng)論 1 8
  • 目錄 上一章 文|老兵 秋天說(shuō)來(lái)就來(lái)了,秋風(fēng)一陣一陣的,有些肆無(wú)忌憚,山上的樹(shù)葉都嘩啦啦爭(zhēng)先恐后落地了,唯...
    老兵_95閱讀 661評(píng)論 4 2

友情鏈接更多精彩內(nèi)容