什么网站可以做机票行程单,阿里云网站备案需要多久,合肥网站制作培训,徐州百姓网NSURLProtocol能够拦截UIWebView内所有的请求#xff0c;但是WKWebView 中的请求却完全不遵从这一规则#xff0c;只是象征性调用canInitWithRequest方法#xff0c;之后的整个请求流程似乎就与 NSURLProtocol 完全无关了。使我一度认为WKWebView请求不遵守NSURLProtocol协议…NSURLProtocol能够拦截UIWebView内所有的请求但是WKWebView 中的请求却完全不遵从这一规则只是象征性调用canInitWithRequest方法之后的整个请求流程似乎就与 NSURLProtocol 完全无关了。使我一度认为WKWebView请求不遵守NSURLProtocol协议。
其实是能够做到的因为WKWebView没有开放相关的API所以我们需要使用私有API调用来实现。使用WKBrowsingContextController和registerSchemeForCustomProtocol。 通过反射的方式拿到了私有的 class/selector。通过kvc取到browsingContextController。通过把注册把 http 和 https 请求交给 NSURLProtocol 处理。
[NSURLProtocol wk_registerScheme:http];
[NSURLProtocol wk_registerScheme:https];下面直接上源代码吧
//FOUNDATION_STATIC_INLINE 属于属于runtime范畴你的.m文件需要频繁调用一个函数,可以用static inline来声明。在SDWebImage读取内存的缓存也用到这个声明。
FOUNDATION_STATIC_INLINE Class ContextControllerClass() {
static Class cls;
if (!cls) {
cls [[[WKWebView new] valueForKey:browsingContextController] class];
}
return cls;
}FOUNDATION_STATIC_INLINE SEL RegisterSchemeSelector() {
return NSSelectorFromString(registerSchemeForCustomProtocol:);
}FOUNDATION_STATIC_INLINE SEL UnregisterSchemeSelector() {
return NSSelectorFromString(unregisterSchemeForCustomProtocol:);
}implementation NSURLProtocol (WebKitSupport) (void)wk_registerScheme:(NSString *)scheme {
Class cls ContextControllerClass();
SEL sel RegisterSchemeSelector();
if ([(id)cls respondsToSelector:sel]) {
// 放弃编辑器警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored -Warc-performSelector-leaks
[(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
}
} (void)wk_unregisterScheme:(NSString *)scheme {
Class cls ContextControllerClass();
SEL sel UnregisterSchemeSelector();
if ([(id)cls respondsToSelector:sel]) {
// 放弃编辑器警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored -Warc-performSelector-leaks
[(id)cls performSelector:sel withObject:scheme];
#pragma clang diagnostic pop
}
}
注册后WKWebView内的请求也会走canInitWithRequest方法了。
转载https://www.jianshu.com/p/4fc13d4d5607