WKWebView - 攔截網(wǎng)絡(luò)請求 && 離線化

簡單筆記,不具備參考價值~

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容