日常收录

WKWebView 支持 NSURLProtocol 协议 (W

2018-12-24  本文已影响0人  会飞的超大鱼

WKWebView 在iOS8中就有了,就是为了替代现有的UIWebView,WKWebView相较于UIWebView的优点这里就不一一说明了,相信大家也很清楚。但是在使用WKWebView的时候还会遇到很多坑,比如不支持 NSURLProtocol 协议、Cookie支持不是很友好等。
WKWebView支持NSURLProtocol协议,可以做请求重定向,防止DNS劫持,支持WebP格式图片,缓存等...

使用以下下方法可以满足 WKWebView 支持 NSURLProtocol 协议:
新建一个WKWebView的分类,写一个方法 supportURLProtocol

- (void)supportURLProtocol {
    // 参考资料:https://www.jianshu.com/p/8f5e1082f5e0
    // 注册scheme
    Class cls = NSClassFromString(@"WKBrowsingContextController");
    SEL selector = NSSelectorFromString(@"registerSchemeForCustomProtocol:");
    if ([cls respondsToSelector:selector]) {
        // 通过http和https的请求,同理可通过其他的Scheme 但是要满足ULR Loading System
        // 以下方法类似:performSelector:withObject:
        IMP (*func)(id, SEL, id) = (void *)[cls methodForSelector:selector];
        func(cls, selector, @"http");       // 注册http
        func(cls, selector, @"https");      // 注册https
    }
}

demo 地址

https://github.com/LiliCode/NSURLProtocol-WKWebView

demo使用说明

  1. 将 WKWebView+NSURLProtocol 分类导入工程中
  2. 在使用到 WKWebView 的地方调用 supportURLProtocol 方法
self.wkWebView = ...
[self.wkWebView supportURLProtocol];
  1. 创建一个继承自 NSURLProtocol 类的Protocol协议对象(比如:WKWebViewURLProtocol),并实现其中的方法(参考链接:https://www.jianshu.com/p/7c89b8c5482a)。
  2. 注册自定义 NSURLProtocol
[NSURLProtocol registerClass:[WKWebViewURLProtocol class]];

支持WebP格式图片

使用 SDWebImage 加载WebP格式图片,需要导入WebP分支

pod 'SDWebImage/WebP'

在 NSURLProtocol 的重定向方法中判断图片中是否有 webp 字样,然后使用 SDWebImage 中的方法加载WebP图片。
参考链接:https://www.jianshu.com/p/e2459c9e9340

防止DNS劫持

使用阿里云的 AlicloudHttpDNS 可以实现此功能

上一篇 下一篇

猜你喜欢

热点阅读