zhengmiaokai / MKWebResources

通过 "WKURLSchemeHandler + AjaxHook",实现WKWebview的资源拦截,解决了Ajax/Fetch请求的Cookie与HTTPBody信息同步问题,为H5秒开项目提供基础支持。
15 stars 8 forks source link

MKWebResources

通过 "WKURLSchemeHandler + AjaxHook",实现WKWebview的资源拦截,解决了Ajax/Fetch请求的Cookie与HTTPBody信息同步问题,为H5秒开项目提供基础支持。

优缺点

1、使用URLSchemeHandler相比URLProtocol可控性更优,可以具体到单个WebView的资源拦截开关,不会造成全局性的影响。

2、URLSchemeHandler不受WebKit缓存机制的影响,只要设置了相应URLScheme的请求都能拦截。

3、使用系统私有api兼容iOS13的crash以及支持请求重定向,具体接口名已做混淆。

3、对H5页面的侵入性较低,除了CDN资源请求转化为本地资源映射,其他基本无感知。

使用示例

APP冷启动后加载web资源

// 开启web秒开
[[MKWebFastManager sharedInstance] startWebFast];

// 实现资源加载逻辑
- (void)loadWebResource {

}

// 实现资源命中逻辑
- (NSData *)obtainLocalResource:(NSURL *)URL {
    return nil;
}

WebView注入URLSchemeHandler

// 在WebView初始化之前注入
[[MKWebFastManager sharedInstance] setURLSchemeWithConfiguration:configuration pageLink:_pagUrl];
 _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];

WebView注入HookAjaxHandler

// 在WebView开始加载之前注入
[[MKWebFastManager sharedInstance] startAjaxHookWithWebView:_webView pageLink:_pagUrl];
[_webView loadRequest:request];

源码参考:通过hook ajax/fetch请求,实现Cookie与HTTPBody的同步逻辑,是基于Git开源项目-KKJSBridge的相关代码改造。