欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS WKWebView无法处理URL Scheme和App Store链接的问题解决

程序员文章站 2023-12-18 19:21:28
wkwebview简介 uiwebview自ios2就有,wkwebview从ios8才有,毫无疑问wkwebview将逐步取代笨重的uiwebview。通过简单的测试即...

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

总结

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

上一篇:

下一篇: