WKWebview 和 WebViewJavascriptBridge 使用

有個(gè)要提前說一下小压,WKWebview cookie 與Native 的 cookie 是分開的弄息,在接入WKWebview 的時(shí)候發(fā)現(xiàn)無法同步cookie猬膨,試過很多方法,還是不行答毫。

最后還是不甘心的換回了webView, 如果有解決這個(gè)問題的麻煩指教一下褥民,給你紅包,哈哈洗搂。

不管怎么樣消返,多知道些東西總是好的载弄。


WKWebview

Demo在這

先來個(gè)最直觀的,為什么要用WKWebview
這里分別用WKWebview 和UIWebview加載了一個(gè)百度的網(wǎng)頁,內(nèi)存的占用情況如下


  • WKWebview
904629-681aef2c4278a7f7.png
  • UIWebview
904629-36ae9c8de0752860.png

相比之下撵颊,WKWebView占用20M宇攻,而UIWebView占用73M,這性能提升的不只一點(diǎn)點(diǎn)倡勇。具體的要了解和使用 WKWebview 的逞刷,給個(gè)友情鏈接 劉彥瑋的技術(shù)博客


這里主要講下 WKWebViewJavascriptBridge ,一個(gè)優(yōu)秀的第三方框架

之前我也是自己封裝WK做的交互译隘,后面偶然間看到的這個(gè)開源庫,8000+ star洛心,果斷上手固耘。 安卓那邊也有個(gè)類似這種的庫, 2000+ star,調(diào)用方法基本類似词身, 這樣 與前端的交互就可以只寫一套代碼了厅目,輕松加愉快。


先做一個(gè)簡單Demo熟悉下
先導(dǎo)入
pod 'WebViewJavascriptBridge', '~> 5.0

904629-611ab58e378a2815.png

如果用UIwebview就導(dǎo)入WebViewJavascriptBridge法严。

WKWebViewJavascriptBridge 是后面加入的损敷,用WKWebview要導(dǎo)入這個(gè)頭文件

這里用一個(gè)單例類用來管理交互 函數(shù),像Cordova那種寫插件的形式深啤,寫在一個(gè)類供JS調(diào)用,具體的可以看Demo拗馒。


html 的代碼段落

貼一下 demo.html 的 JS 段落 ,看注釋,主要知道JS 怎么調(diào)用 原生方法 和 注冊(cè)JS方法 供JS調(diào)用

 <script type="text/javascript">


//這是必須要寫的溯街,用來初始化一些設(shè)置
        function setupWebViewJavascriptBridge(callback) {
            if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
            if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
            window.WVJBCallbacks = [callback];
            var WVJBIframe = document.createElement('iframe');
            WVJBIframe.style.display = 'none';
            WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
            document.documentElement.appendChild(WVJBIframe);
            setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
        }


//這也是固定的诱桂, OC 調(diào)JS , 需要給OC調(diào)用的函數(shù)必須寫在這個(gè)函數(shù)里面
        setupWebViewJavascriptBridge(function(bridge) {

            bridge.registerHandler('testJSFunction', function(data, responseCallback) {
                alert('JS方法被調(diào)用:'+data);
                responseCallback('js執(zhí)行過了');
            })


        })


//這個(gè) shareClick 就是 原生那邊 注入的函數(shù) 呈昔, 通過這個(gè)方法來調(diào)用原生 和傳值
//parmas 是JS 給OC的數(shù)據(jù) 挥等, response 是 OC函數(shù)被調(diào)用之后 再 告訴JS 我被調(diào)用了
//比如微信分享,給Dic給原生 堤尾, 原生分享成功后再把結(jié)果回調(diào)給JS 進(jìn)行處理
        function shareClick() {
            var params = {'title':'測(cè)試分享的標(biāo)題','content':'測(cè)試分享的內(nèi)容','url':'http://www.baidu.com'};
            WebViewJavascriptBridge.callHandler('shareClick',params,function(response) {

                console.log(response);


            });
        }



    </script>



原生代碼

//初始化
#import "WKWebViewJavascriptBridge.h"  //注意是 WK 開頭的 肝劲, 如果不需要適配8.0以下的可以直接就用WKWebview
@property WebViewJavascriptBridge* bridge;
self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView];  
//注冊(cè)原生方法給JS調(diào)用
- (void)registShareFunction
{

    [_webViewBridge registerHandler:@"shareClick" handler:^(id data, WVJBResponseCallback responseCallback) {
        // data 的類型與 JS中傳的參數(shù)有關(guān)
        NSDictionary *tempDic = data;
        // 在這里執(zhí)行分享的操作
        NSString *title = [tempDic objectForKey:@"title"];
        NSString *content = [tempDic objectForKey:@"content"];
        NSString *url = [tempDic objectForKey:@"url"];
        
        // 將分享的結(jié)果返回到JS中
        NSString *result = [NSString stringWithFormat:@"分享成功:%@,%@,%@",title,content,url];
        
        responseCallback(result);  //回調(diào)給JS
        
        
    }];
}




//原生調(diào)用JS , JS 中先聲明testJSFunction 函數(shù)
-(void)pp_hander
{
    
    //testJSFunction 是JS的方法
    [_webViewBridge callHandler:@"testJSFunction" data:@"一個(gè)字符串" responseCallback:^(id responseData) {
        
        NSLog(@"調(diào)用完JS后的回調(diào):%@",responseData);
        
    }];
}

基本用法差不多就這些,很簡潔郭宝,用起來也挺簡單辞槐,準(zhǔn)備接入目前的項(xiàng)目使用。


如果不知道在模擬器怎么看調(diào)試網(wǎng)頁粘室,可以看看淘寶前端團(tuán)隊(duì)的這篇 在 iOS 模擬器中調(diào)試 Web 頁面
Safari的開發(fā)者選項(xiàng)催蝗,如果沒有,去偏好設(shè)置->高級(jí)->顯示開發(fā)者選項(xiàng)就有了


如果調(diào)用不成功育特,可能是這些原因

 function setupWebViewJavascriptBridge(callback) {
            if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
            if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
            window.WVJBCallbacks = [callback];
            var WVJBIframe = document.createElement('iframe');
            WVJBIframe.style.display = 'none';
            WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
            document.documentElement.appendChild(WVJBIframe);
            setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
        }

寫在JS里的代碼這里是不能動(dòng)的丙号,原樣貼上去就行先朦。 之前有一次莫名其妙老是調(diào)用不了OC的方法, 后來發(fā)現(xiàn)是

window.WebViewJavascriptBridg 寫成了 window.WebView JavascriptBridg犬缨, 一直沒看到喳魏,在網(wǎng)頁端一直報(bào)找不到 WebViewJavascriptBridg這個(gè)變量,看到報(bào)錯(cuò)應(yīng)該能發(fā)現(xiàn)在定義的時(shí)候有出錯(cuò)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末怀薛,一起剝皮案震驚了整個(gè)濱河市刺彩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枝恋,老刑警劉巖创倔,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異焚碌,居然都是意外死亡畦攘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門十电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來知押,“玉大人,你說我怎么就攤上這事鹃骂√ǘⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵畏线,是天一觀的道長静盅。 經(jīng)常有香客問我,道長寝殴,這世上最難降的妖魔是什么温亲? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮杯矩,結(jié)果婚禮上栈虚,老公的妹妹穿的比我還像新娘。我一直安慰自己史隆,他們只是感情好魂务,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泌射,像睡著了一般粘姜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熔酷,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天孤紧,我揣著相機(jī)與錄音,去河邊找鬼拒秘。 笑死号显,一個(gè)胖子當(dāng)著我的面吹牛臭猜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播押蚤,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蔑歌,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了揽碘?” 一聲冷哼從身側(cè)響起次屠,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雳刺,沒想到半個(gè)月后劫灶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掖桦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年本昏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滞详。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凛俱,死狀恐怖紊馏,靈堂內(nèi)的尸體忽然破棺而出料饥,到底是詐尸還是另有隱情,我是刑警寧澤朱监,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布岸啡,位于F島的核電站,受9級(jí)特大地震影響赫编,放射性物質(zhì)發(fā)生泄漏巡蘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一擂送、第九天 我趴在偏房一處隱蔽的房頂上張望悦荒。 院中可真熱鬧,春花似錦嘹吨、人聲如沸搬味。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碰纬。三九已至,卻和暖如春问芬,著一層夾襖步出監(jiān)牢的瞬間悦析,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工此衅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留强戴,地道東北人亭螟。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像酌泰,于是被迫代替她去往敵國和親媒佣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 關(guān)于UIWebView的介紹陵刹,相信看過上文的小伙伴們默伍,已經(jīng)大概清楚了吧,如果有問題衰琐,歡迎提問也糊。 本文是本系列...
    CoderLF閱讀 8,963評(píng)論 2 12
  • 前言 關(guān)于UIWebView的介紹狗热,相信看過上文的小伙伴們钞馁,已經(jīng)大概清楚了吧,如果有問題匿刮,歡迎提問僧凰。 本文是本系列...
    Dark_Angel閱讀 28,867評(píng)論 67 291
  • 通過學(xué)習(xí),你將會(huì)學(xué)習(xí)以下幾個(gè)方面的內(nèi)容: **什么是WKWebView以及它和UIWebView的區(qū)別是什么 **...
    SOI閱讀 11,629評(píng)論 18 42
  • 前言 iOS開發(fā)中绩鸣,用來顯示一個(gè)html頁、H5頁纱兑,經(jīng)常會(huì)用的一個(gè)控件是WebView呀闻。說到WebView,你知道...
    Dark_Angel閱讀 23,430評(píng)論 31 287
  • 2017年10月6日潜慎,從內(nèi)羅畢自駕出發(fā)捡多;2017年10月11日,我完成了乞力馬扎羅的登頂勘纯。這次登山機(jī)會(huì)來之不易局服,登...
    大潮非洲閱讀 381評(píng)論 0 0