UIWebView到WKWebView遷移問題

WKWebView是iOS8后出來的新框架.

WKWebView的接口簡單介紹:點擊鏈接
WKWebView和UIWebView性能對比分析:點擊鏈接
WKWebView和UIWebView的接口對比介紹:點擊鏈接

使用WKWebView主要遇到三個問題:

  • WKWebView不支持web直接拉起其他app(包括AppStore)
    原生代碼通過攔截,自己進(jìn)行跳轉(zhuǎn).

    1 . 先獲取可能需要跳轉(zhuǎn)的URL Scheme
self.needOpenPrefixs = [NSMutableArray array];
        [self.needOpenPrefixs addObject:@"https://itunes.apple.com"];
        NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
        NSArray *queriesSchemes = infoDict[@"LSApplicationQueriesSchemes"];
        for (NSString *scheme in queriesSchemes) {
            NSString *prefix = [NSString stringWithFormat:@"%@://",scheme];
            [self.needOpenPrefixs addObject:prefix];
        }

2 . 攔截需要跳轉(zhuǎn),判斷是否安裝,若安裝了進(jìn)行跳轉(zhuǎn)

    for (NSString *str in self.needOpenPrefixs) {
        if ([requestUrlStr rangeOfString:str options:NSCaseInsensitiveSearch].location == 0) {
            if ([[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL]) {
                decisionHandler(WKNavigationActionPolicyCancel);
                if ([UIApplication instancesRespondToSelector:@selector(openURL:options:completionHandler:)]) {
                        [[UIApplication sharedApplication] openURL:navigationAction.request.URL options:@{UIApplicationOpenURLOptionUniversalLinksOnly:@(NO)} completionHandler:nil];
                } else {
                    [[UIApplication sharedApplication] openURL:navigationAction.request.URL];
                }
                return;
            }
        }
    }
  • WKWebView和JS交互代碼不同,包括JS端
    1 . JS端用如下方式向OC發(fā)送消息
window.webkit.messageHandlers.{NAME}.postMessage()

當(dāng)傳遞參數(shù)為空時,必須傳入null,即:

window.webkit.messageHandlers.{NAME}.postMessage(null)

2 . WKWebView不支持直接返回值

在UIWebView中,支持直接返回值.
例如:

userToken = TingShuJS.getUserToken();

在iOS端注入TingShuJS和getUserToken后,調(diào)用方法

-(NSString *)getUserToken{
   NSString *userToken = [LMUserManager shareUserManager].activeUser.token;
   return userToken;
}

在JS端可以接收到userToken.

JS端使用對應(yīng)發(fā)送消息方法后,

userToken = window.webkit.messagehandlers.getUserToken(null);

iOS端調(diào)用getUserToken方法后,JS無法接收到userToken.

3 . 其他注意點
WKWebView不再適合下面這種方式來設(shè)置全局UserAgent,只能設(shè)置request的時候自定義UserAgent.

    [[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];
  • target='_blank'的標(biāo)簽無法打開
    實現(xiàn)代理如下:
-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{
    WKFrameInfo *frameInfo = navigationAction.targetFrame;
    if (![frameInfo isMainFrame]) {
        [webView loadRequest:navigationAction.request];
    }
    return nil;
}

其他解決方案請戳我

WX20170716-204730@2x.png
3a75d7348843)

iOS,Android,JS三端統(tǒng)一方案

基本原理:
注冊handler的時候,把相關(guān)信息存起來.

- (void)registerHandler:(NSString *)handlerName handler:(WVJBHandler)handler {
    _base.messageHandlers[handlerName] = [handler copy];
}

攔截url,處理對應(yīng)handler

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (webView != _webView) { return YES; }
    
    NSURL *url = [request URL];
    __strong WVJB_WEBVIEW_DELEGATE_TYPE* strongDelegate = _webViewDelegate;
    if ([_base isWebViewJavascriptBridgeURL:url]) {
        if ([_base isBridgeLoadedURL:url]) {
            [_base injectJavascriptFile];
        } else if ([_base isQueueMessageURL:url]) {
            NSString *messageQueueString = [self _evaluateJavascript:[_base webViewJavascriptFetchQueyCommand]];
            [_base flushMessageQueue:messageQueueString];
        } else {
            [_base logUnkownMessage:url];
        }
        return NO;
    } else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
        return [strongDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
    } else {
        return YES;
    }
}
  • DSBridge
    DSBridge是最近新出的框架,使用起來更簡單.
    基本原理暫未了解.
    了解介紹點擊鏈接

  • 其他
    Cordova

iOS webView拉起App問題

iOS 9開始,必須添加URL Scheme,才能正確判斷是否安裝App.
iOS 10 必須添加URL Scheme,webView否則無法判斷應(yīng)用是否安裝,無法拉起App.

  • 獲取App的URL Scheme
    對ipa進(jìn)行解包,在plist文件中找到URL Type選項,URL Scheme.
    例如手機京東:
京東URL Schemes

兩個URL Scheme
openApp.jdMobile
openjd

注意: URL Scheme不區(qū)分大小寫

  • 部分App的URL Scheme如下:

注意:有些應(yīng)用區(qū)分iPhone版和iPad版,URL Scheme可能不同

手機京東
openapp.jdmobile
openjd

京東HD
openapp.jdipad

一號店
yhd

貝貝
beibeiapp

當(dāng)當(dāng)
dangdang
dd

當(dāng)當(dāng)HD
dangdanghd
ddhd

國美
gomeeshop

聚美
jumei
jumeimall
jumeiwallet

蘑菇街
mogujie

蘑菇街HD
mgjhd

蘇寧
com.suning.suningebuy
suning

蘇寧
com.suning.suning4ipad

手機淘寶
taobao

淘寶HD
taobaohd

天貓
tmall

唯品會
vipshop
vsspecialswitch
vsspecial

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肌厨,一起剝皮案震驚了整個濱河市内斯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扫夜,老刑警劉巖谱邪,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炮捧,死亡現(xiàn)場離奇詭異,居然都是意外死亡惦银,警方通過查閱死者的電腦和手機咆课,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扯俱,“玉大人傀蚌,你說我怎么就攤上這事≌合牛” “怎么了善炫?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長库继。 經(jīng)常有香客問我箩艺,道長,這世上最難降的妖魔是什么宪萄? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任艺谆,我火速辦了婚禮,結(jié)果婚禮上拜英,老公的妹妹穿的比我還像新娘静汤。我一直安慰自己,他們只是感情好居凶,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布虫给。 她就那樣靜靜地躺著,像睡著了一般侠碧。 火紅的嫁衣襯著肌膚如雪抹估。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天弄兜,我揣著相機與錄音药蜻,去河邊找鬼瓷式。 笑死,一個胖子當(dāng)著我的面吹牛语泽,可吹牛的內(nèi)容都是我干的贸典。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼踱卵,長吁一口氣:“原來是場噩夢啊……” “哼瓤漏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颊埃,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蔬充,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后班利,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饥漫,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年罗标,在試婚紗的時候發(fā)現(xiàn)自己被綠了庸队。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡闯割,死狀恐怖彻消,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宙拉,我是刑警寧澤宾尚,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站谢澈,受9級特大地震影響煌贴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锥忿,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一牛郑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敬鬓,春花似錦淹朋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至希痴,卻和暖如春者甲,著一層夾襖步出監(jiān)牢的瞬間春感,已是汗流浹背砌创。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工虏缸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫩实。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓刽辙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甲献。 傳聞我的和親對象是個殘疾皇子宰缤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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

  • 前言 關(guān)于UIWebView的介紹,相信看過上文的小伙伴們晃洒,已經(jīng)大概清楚了吧慨灭,如果有問題,歡迎提問球及。 本文是本系列...
    CoderLF閱讀 8,949評論 2 12
  • 1氧骤、加載網(wǎng)頁 WKWebView *webView = [[WKWebView alloc] initWithFr...
    LearningCoding閱讀 3,095評論 0 2
  • 隨著H5技術(shù)的興起,在iOS開發(fā)過程中吃引,難免會遇到原生應(yīng)用需要和H5頁面交互的問題筹陵。其中會涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,062評論 1 8
  • iOS 的 Cookie 存取 https://juejin.im/entry/58d4c4cc44d904006...
    Farmers閱讀 5,903評論 0 16
  • 轉(zhuǎn)載:http://www.cnblogs.com/NSong/p/6489802.html 導(dǎo)語 WKWebVi...
    李小威閱讀 4,852評論 8 9