美文网首页ios知识积累iOS开发iOS学习
WKWebView-一个美丽的半成品

WKWebView-一个美丽的半成品

作者: MarkNote | 来源:发表于2015-11-19 12:51 被阅读2898次
    image07.png

    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的一个半成品而已,需要酌情使用。

    相关文章

      网友评论

      • 我的昵称在简书已被使用啦:WKWebView的请求不可以被NSURLProtocol截获
        https://github.com/yeatse/NSURLProtocol-WebKitSupport/blob/master/Source/NSURLProtocol%2BWebKitSupport.m
        彩虹丶直至黑白:这个你们用着能通过审核吗?
        深渊漫步者亚尔特留斯:@3121d806fb53 不错,实测有效
        MarkNote:@3121d806fb53 看着不错👌
      • leostc:本来想第二个方法绕过第一个坑,结果发现第二tm也是坑!
      • d8cc064aa426:WKWebView在内存占用和滚动刷新这方面确实很好,但加载页面就是屎一样的表现,用5C测试,调用其initWithFrame:方法初始化居然用了二十几毫秒,从调用loadRequest:方法到- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler方法执行居然要将近300毫秒,到加载结束还要将近200毫秒,我的天,打开一个简单的本地页面要将近500毫秒,这对于很多混合开发的应用是无法忍受的。相反,用UIWebView几乎是秒开,整个过程也就几十毫秒。
        8816b41d093c:@fenglaileyo 想问问加载 NSString格式本地Html页面,是不是目前还是应该使用UIWebView, 用WKWebiview始终无法获得正确的本地页面高度,有没有啥解决方法? 谢谢
      • c0e5628f6a62:WKWebView 能支持JavaScriptCore吗?
        c0e5628f6a62:@MarkNote 十分的感谢 我说获取WKWebView的context的时候崩的死去活来呢
        MarkNote:@大鼻头道士 貌似是有点问题的。
        这篇文章(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所加载的上下文中的对象起不了作用。


      • 花前月下:意思就是 我监听不到webView的请求了吧? 我发现WKWebView 无法拦截Request 无法像 UIWebView 的 代理方法那样
        - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
        花前月下:@MarkNote 好的。我查下。谢谢
        MarkNote:@花前月下 WKNavigationDelegate的
        - webView:decidePolicyForNavigationAction:decisionHandler:可以实现类似的功能
      • MarkNote:童鞋们如果遇到其他的场景,也请分享一下让我拓展一下眼界:)
        MarkNote:@d6531142bfb5 在WKWebView中操作Cookie我还没涉及到,不过,这里有一篇文章(http://stackoverflow.com/questions/33156567/getting-all-cookies-from-wkwebview)里面提到FireFox for iOS是这样做的:
        - 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.

        d6531142bfb5:@MarkNote WKWebView好像无法共享cookie,UIWebView就可以

      本文标题:WKWebView-一个美丽的半成品

      本文链接:https://www.haomeiwen.com/subject/hwjlhttx.html