WKWebView的那些坑

为什么要用WKWebView

WKWebView有以下优点:

  1. 采用Nitro JavaScript引擎,运行JavaScript会更快更高效
  2. WKWebView没有缓存,内存占用比较低,对内存压力比较大的APP是一个好消息

是不是心动了呢,别急,请注意以下这些坑

WKWebView的坑

1.版本限制

WKWebView是iOS8的时候引入的,在iOS8之后的系统才能使用。

只适配iOS8以上的系统,总可以放心使用了吧。然而像- (nullable WKNavigation )loadData:(NSData )data MIMEType:(NSString )MIMEType characterEncodingName:(NSString )characterEncodingName baseURL:(NSURL *)baseURL NS_AVAILABLE(10_11, 9_0);这样的方法在iOS9之后才有。使用的时候还是要注意,比较推荐在iOS9及以上版本使用。

2.舍弃了UIWebView同步执行js方法

原来UIWebView提供的同步执行js的方法- (nullable NSString )stringByEvaluatingJavaScriptFromString:(NSString )script;在WKWebView当中没有相对应的同步方法,需要你将原来同步执行js的地方换成WKWebview异步的方法。

3.无缓存带来的问题

无缓存可以是WKWebView占用的内存更小,APP的运行压力降低,但是无缓存会在你网络服务或者链路不稳定的时候出现异常。因为有缓存的话可以去读缓存,而不需要每次都从服务器请求数据,比较大的降低了服务不稳定的影响。

无缓存还有一个比较大的劣势就是实现cookie在H5和APP的同步时比较麻烦。因为UIWebView和NSURLRequest是共享cookie的,实现同步比较简单。WKWebView没有缓存,也就没有Cookie存储,只能在每次打开页面时将cookie用js写进页面,比较麻烦,也会有相应的短板,后续会再进行介绍。

WKWebView和UIWebview的混用

WKWebView是一种不错的选择,也是一种趋势,但因为目前还存在一部分iOS8和少量的iOS7用户,所以我们只能将WKWebView和UIWebView进行混用。WKWebView和UIWebView的混用就是根据系统版本等情况来判断使用WKWebView还是UIWebView,没有cookie同步需求的话还是推荐使用WKWebView的。

我写了一个SJWebView的类,封装了基本的Webview的方法,基本可以无缝从UIWebView切换到WKWebView,大家可以参考一下。

SJWebView点击这里