Description
为了让 iOS WebView 打开H5快,执行响应提升。现起项目优化 WKWebView ,逐步替换掉 UIWebView。
1. WKWebView 拦截 JS 中的 Alert / Confirm / Prompt
在WKWebview中,js的alert是不会出现任何内容的,必须重写WKUIDelegate委托的runJavaScriptAlertPanelWithMessage message方法,自己处理alert。类似的还有Confirm和prompt也和alert类似,这里我只以alert为例。
// 调用JS的alert()方法
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
// 调用JS的confirm()方法
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
// 调用JS的prompt()方法
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;
示例代码:https://github.com/JYSDeveloper/WKWebViewDemo/blob/master/WKWebViewDemo/ViewController.m#L167
验证重点:① Confirm Prompt 的回掉 ② 提示框UI的展示
2. WKWebView 中 window.open 失效 以及 标签带有 target='_blank'
_blank 标签,众所周知,是让浏览器新开一个页面来打开链接,而不是在原网页上打开。
在UIWebView上,只有一个页面,所以会自动在原来的页面上打开新链接。
但是在WKWebView上就不是这样了。
x <a onclick="window.open('http://www.qq.com')">window.open</a>
√ <a onclick="window.open('http://www.qq.com', '_self')">window.open</a>
x <a href="https://www.baidu.com" target='_blank'>target _blank</a>
√ <a href="https://www.baidu.com">target _self</a>
示例页面:window.open http://ui.ptlogin2.qq.com/cgi-bin/login?appid=636026402&style=8&s_url=http%3A%2F%2Fxw.qq.com%2Findex.htm <点击注册新页面,或忘记密码>
解决方法:http://www.jianshu.com/p/3a75d7348843
3. WKWebView 白屏问题
白屏划分为三类
其一,浏览器访问H5遇到网络错误、证书错误、连接超时错误等。需拦截此等错误code,并显示友好的UI展示(特殊code需过滤);
其二,进度条引起的白屏现象,如网络重定向时,进度条归为0引起白屏;WKWebView 进度是按照真实的下载数据得出的进度百分数,但是当服务器慢请求时,进度一直为0,引发不好的体验
① 进度条宽度先是100%,然后立马变为 0%
② 频繁刷新,进度条前进后,既然后退了
③ 访问网络超时网址时,进度条停在 0% 处
其三,H5渲染白屏。
4. WKWebView 与 Cookie
Cookie 问题是目前 WKWebView 的一大短板
① WKWebView loadRequest H5的时候,发现 Cookie 没有带上,而切换页面的时候,则可以。这会影响依赖 cookie 做登录校验的 H5
原因在于:WKWebView Cookie 问题在于 WKWebView 发起的请求不会自动带上存储于 NSHTTPCookieStorage 容器中的 Cookie
原理链接:http://www.10tiao.com/html/330/201701/2653578513/1.html
② WKWebView 访问任何域名的网址,都会带上默认的 token 等 cookie 敏感信息。
修复只针对自己的域名做单独处理。
5. 自动抓取分享设置
参考类库:https://github.com/beyondabel/BAWebView/blob/master/BAWebView/BAWebView/BAWebView.m
WKWebVIew介绍:
https://zhihu.com/question/54564198/answer/140030597
附:
http://www.jianshu.com/p/403853b63537
http://www.jianshu.com/p/90a90bd13aac
http://www.jianshu.com/p/7bb5f15f1daa
http://liuyanwei.jumppo.com/2015/10/17/ios-webView.html
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1483682025_enmey
http://www.jianshu.com/p/9513d101e582
github: