WKWebView问题优化指南了

一、Cookie不能同步和丢失

  1. 首次加载页面的时候带不上 Cookie;
  2. Ajax 类型的请求带不上 Cookie;
  3. 跳转页面时(status code 302) 带不上 Cookie;
  4. 前端设置 document.cookie 不能及时被同步。

解决方案

  1. 首次加载的时候手动设置 request header field 'Cookie';
  2. 通过 hook js document.cookie setter and getter 方法,注入 名字为 cookie 的 bridge,当 js 端有cookie变更的时候会及时通知 native,从而实现和 js 端同步 cookie;
  3. Ajax 的问题采用注入 document.cookie = name=value; 脚本解决;

二、不支持 NSURLProtocol 拦截

  1. iOS 11 之前的处理 (call private API) ;
  2. iOS 11 之后的处理(hook public API)。

解决方案

  1. iOS 11 之前采用 [WKBrowsingContextController registerSchemeForCustomProtocol:@"https"] 私有 API 实现;
  2. iOS 11 之后采用 hook +handlesURLScheme 使之 -setURLSchemeHandler:forURLScheme 支持 http 和 https 注册;

三、POST 类型请求 Request Body 丢失

当使用网络拦截后,WebKit的IPC进程的请求会转到主进程执行,由于进程切换回导致性能下降,所以WebKit会主动丢弃request的body。这对我们来说,是不可接受的,有想要网络拦截,还想要body。有什么办法能解决这个问题呢?这样根据不同的iOS版本分开来看。

  1. iOS 11 之后采用 hook public API 的方式;
  2. iOS 11 之前采用 hook public API 和 hook js XHR。

解决方案

  1. 在 NSURLProtocol 子类中的 - startLoading 通过获取 request.HTTPBodyStream 来填充 request.HTTPBody 实现。但是此方法在有些时候(如Ajax)会失败;
  2. 通过 hook js XMLHTTPRequest 相关方法实现。具体的来说,注入 XHR requestType 为 post 的 send 方法,把 requstBody 和对应的 URL 通过桥的方式提前传给客户端,客户端接收端数据后,保存起来,在 NSURLProtocol 子类中的 -initWithRequest:cachedResponse:client: 方法拦截中填充保存在客户端的 requstBody 到 request 中,即可保证 requestBody 不会丢失;

四、白屏问题

  1. 内存占用过大导致 WebContent process 进程崩溃;
  2. 内存占用过大导致 WebContent process 被挂起。

解决方案

  1. 当 WKWebView 占用内存过大的时候,会导致 WebContent process crash,会回调 -webViewWebContentProcessDidTerminate:,可在此方法中添加 [webView reload],重新载入页面解决;
  2. 当 WKWebView 占用内存过大的时候(多见于选择相册) ,会导致 WebContent process 被挂起,此情况不会调用 -webViewWebContentProcessDidTerminate:,可通过在 WebViewController 的 -viewWillAppear: 方法中检测 webView.title 是否存在,如果不存在可认为进程被挂起,可在此方法中添加 [webView reload],重新载入页面解决;

五、无法通过 URL Scheme 方式打开三方 App

WKWebView 限制了 WEB 页面打开三方 APP 的能力,必须在代理方法 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 中拦截,判断 URL 中的 Scheme 或 host,然后通过 [[UIApplication sharedApplication] openURL:] 方法打开。

需要注意的是,对于三方APP,通过 Scheme 来判断即可,如高德地图的 scheme 是 iosamaps。但对于 iOS 部分自带 App,则需要通过 URL host 判断,如 AppStore 的 host 是 http://itunes.apple.com

剩余问题

据网上文章描述,有的情况用以上的两种解决方案不可行。可通过遍历 webView.subviews,是否包含 WKCompositingView 来判断白屏情况,如果是则收回旧 webView,重新创建新的 webView。但是此方法是否可行,暂未验证,目前也未采用。

- (BOOL)isBlankView:(UIView *)view { // YES:blank
    Class wkCompositingView =NSClassFromString(@"WKCompositingView");
    if ([view isKindOfClass:[wkCompositingView class]]) {
        return NO;
    }
    for(UIView *subView in view.subviews) {
        if (![self isBlankView:subView]) {
            return NO;
        }
    }
    return YES;
}

转:https://zhuanlan.zhihu.com/p/58681116

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容