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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。