美文网首页日常收录
WKWebView 支持 NSURLProtocol 协议 (W

WKWebView 支持 NSURLProtocol 协议 (W

作者: 会飞的超大鱼 | 来源:发表于2018-12-24 17:56 被阅读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 可以实现此功能

    相关文章

      网友评论

        本文标题:WKWebView 支持 NSURLProtocol 协议 (W

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