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使用说明
- 将 WKWebView+NSURLProtocol 分类导入工程中
- 在使用到 WKWebView 的地方调用 supportURLProtocol 方法
self.wkWebView = ...
[self.wkWebView supportURLProtocol];
- 创建一个继承自 NSURLProtocol 类的Protocol协议对象(比如:WKWebViewURLProtocol),并实现其中的方法(参考链接:https://www.jianshu.com/p/7c89b8c5482a)。
- 注册自定义 NSURLProtocol
[NSURLProtocol registerClass:[WKWebViewURLProtocol class]];
支持WebP格式图片
使用 SDWebImage 加载WebP格式图片,需要导入WebP分支
pod 'SDWebImage/WebP'
在 NSURLProtocol 的重定向方法中判断图片中是否有 webp 字样,然后使用 SDWebImage 中的方法加载WebP图片。
参考链接:https://www.jianshu.com/p/e2459c9e9340
防止DNS劫持
使用阿里云的 AlicloudHttpDNS 可以实现此功能
网友评论