为什么要用 WKWebView
WKWebView 有以下优点:
- 采用 Nitro JavaScript 引擎,运行 JavaScript 会更快更高效
- 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,大家可以参考一下。