WKWebView自推出之后,得到不少同学的赞扬。主要的赞扬集中在2个方面:加载快,CPU和内存耗用都很小。
很少有人说这个东西的坏话。而我,则来泼2盆冷水。我亲身使用之后,得出的结论是:WKWebView只是Apple的一个半成品而已,并不能在所有的场合下替换UIWebView(或者Cocoa中的WebView)。
WKWebView的第一个缺陷:加载本地资源有bug
经常有需求需要加载HTML5的内容。在这种场景下,可能使用WKWebView会遇到一些问题。
你可以使用loadHTMLString
来加载页面,但是,如果HTML字符串中有本地资源的话,你会发现不会加载。
当然有办法可以绕过去,一个办法是在应用内嵌入一个提供HTTP服务的组件。但是但是,这样做多恶心啊!
另一个办法,有人发现WKWebView并不是完全不能加载本地文件,如果文件放在temp
目录下,还是可以加载的。于是,每次将资源靠背到那个目录(实现方法参考http://stackoverflow.com/questions/24882834/wkwebview-not-loading-local-files-under-ios-8 )
但是但是,这样做不光恶心,而且呕吐啊
WKWebView的请求不可以被NSURLProtocol截获
使用NSURLProtocol拦截应用内的NSURLRequst请求是一种高超的技术,可以实现自定义的本地缓存等方案。这种方法既可以拦截UIWebView的请求,也可以拦截通过代码使用NSURLConnect或者NSURLSession发出的请求。
不过,WKWebView却是个例外。
补充:
@3121d806fb53 提出在github上有人针对这个问题整了个解决办法。经 @深渊漫步者亚尔特留斯 实测有效。
综上,WKWebView只是Apple的一个半成品而已,需要酌情使用。
网友评论
https://github.com/yeatse/NSURLProtocol-WebKitSupport/blob/master/Source/NSURLProtocol%2BWebKitSupport.m
这篇文章(http://www.openradar.me/17680867)说
>Unlike the former WebView class, the new WKWebView API doesn't seem to provide a means to access the underlying JSContext. This prevents code using the JavaScriptCore framework from acting on the JavaScript objects living in the context of the page loaded into the WKWebView.
简言之就是WKWebView这货没有API访问它用的JSContext,所以JavascriptCore之类的框架对WKWebView所加载的上下文中的对象起不了作用。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
- webView:decidePolicyForNavigationAction:decisionHandler:可以实现类似的功能
- Cookies used (created) by the WKWebView are actually correctly stored in the NSHTTPCookieStorage.sharedHTTPCookieStorage().
- I just remembered that in Firefox for iOS we force the WKWebView to flush its internal data, including cookies, by replacing its WKProcessPool with a new one. There is no official API, but I am pretty sure that is the most reliable workaround right now.