簡單筆記,不具備參考價值~
WKURLSchemeHandler 的使用參考:https://zhuanlan.zhihu.com/p/56965133,文章相對比較清晰簡單。
閱讀上文后,你可以知道 WKURLSchemeHandler 協(xié)議的使用,以及如何加載離線化資源。
由于WebKit內(nèi)部限制,我們無法攔截 https/http 等協(xié)議,會導(dǎo)致崩潰,原因在于 WebKit 有內(nèi)置協(xié)議白名單,這次協(xié)議由內(nèi)部進(jìn)行處理。
// 下面代碼會崩潰
[webViewConfiguration setURLSchemeHandler:
[[MyWKURLSchemeHandler alloc] init] forURLScheme:@"https"];
解決方案:
iOS 11 系統(tǒng)提供了 handlesURLScheme 方法,判斷 WKWebView 是否能處理 urlScheme ,我們可以 hook 此方法,來支持自己處理 http/https 請求。
/* @abstract Checks whether or not WKWebViews handle the given URL scheme by default.
@param scheme The URL scheme to check.
*/
+ (BOOL)handlesURLScheme:(NSString *)urlScheme API_AVAILABLE(macos(10.13), ios(11.0));
最終代碼:
void WKClassSwizzle(Class class, SEL originalSelector, SEL swizzledSelector) {
class = object_getClass(class);
Method originalMethod = class_getClassMethod(class, originalSelector);
Method swizzledMethod = class_getClassMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
// 在合適的場景調(diào)用
+ (void)wk_hookHandlesURLScheme {
IWKMetaClassSwizzle(self, @selector(handlesURLScheme:), @selector(wk_handlesURLScheme:));
}
+ (BOOL)wk_handlesURLScheme:(NSString *)name {
if ([name isEqualToString:@"http"] ||
[name isEqualToString:@"https"]) {
return NO;
}
if (name.length == 0) {
return NO;
}
return [self wk_handlesURLScheme:name];
}
擴(kuò)展
WKWebView攔截請求資源:http://events.jianshu.io/p/4b2fc44cef8b
WKWebView離線包開發(fā)小記(包含WKWebView復(fù)用池):https://freelf.me/WKWebView%E7%A6%BB%E7%BA%BF%E5%8C%85%E5%BC%80%E5%8F%91%E5%B0%8F%E8%AE%B0