iOS WKWebView无法处理URL Scheme和App Store链接的问题解决
WKWebView简介
UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView。通过简单的测试即可发现UIWebView占用过多内存,且内存峰值更是夸张。WKWebView网页加载速度也有提升,但是并不像内存那样提升那么多。
下面列举一些其它的优势:
1、更多的支持HTML5的特性
2、官方宣称的高达60fps的滚动刷新率以及内置手势
3、Safari相同的JavaScript引擎,且允许JavaScript的Nitro库加载并使用(UIWebView中限制);
4、将UIWebViewDelegate与UIWebView拆分成了14类与3个协议(官方文档说明)
5、占用更少的内存,在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M);
另外用的比较多的,增加加载进度属性:estimatedProgress
iOS WKWebView无法处理URL Scheme和App Store链接解决方法
之前使用 UIWebView 时,当遇到 App Store 下载链接,例如:
https://itunes.apple.com/cn/app/id414478124?mt=8
在 UIWebView 中点击可以自动打开 iPhone 本地 App Store 并跳转到相应 App 的下载页面,
但是当换成 WKWebView 时,我们发现点击 App Store Links 时,有时候无反应,有时则会打开相应 App 的 App Store Web 页面,而不会直接调起本地 App Store。
另外,对于自定义的 URL Scheme 类型链接,在 WKWebView 里直接点击则会报错:Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL";
所以我们需要在 WKWebView 即将加载某一 URL 时,对这两种情况做一下处理,修改 WKWebView 的 delegate 中的 webView:decidePolicyForNavigationAction:decisionHandler:
方法,当遇到上述两种链接时,我们交给系统的 [[UIApplication sharedApplication] openURL:xxx]
来处理即可,代码如图如下:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { NSURL *url = navigationAction.request.URL; NSString *urlString = (url) ? url.absoluteString : @""; // iTunes: App Store link // 例如,微信的下载链接: https://itunes.apple.com/cn/app/id414478124?mt=8 if ([urlString containsString:@"//itunes.apple.com/"]) { [[UIApplication sharedApplication] openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } // Protocol/URL-Scheme without http(s) else if (url.scheme && ![url.scheme hasPrefix:@"http"]) { [[UIApplication sharedApplication] openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } decisionHandler(WKNavigationActionPolicyAllow); }
关于使用 WKWebView 的更多 Tips,可以参考:https://github.com/ShingoFukuyama/WKWebViewTips
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。