karosLi / KKJSBridge

一站式解决 WKWebView 支持离线包,Ajax/Fetch 请求,表单请求和 Cookie 同步的问题 (基于 Ajax Hook,Fetch Hook 和 Cookie Hook)
MIT License
693 stars 120 forks source link

Form表单问题 #15

Closed dhui68 closed 4 years ago

dhui68 commented 4 years ago

页面中含有

标签这种情况,通过form.submit()或者form.onsubmit()提交表单,不会hook拦截

dhui68 commented 4 years ago

NSURLProtocol 拦截处理wkwebview的请求,导致网页中的post请求httpbody,httpbodystream 是空的,才找到你的这个hook方式,但是发现有bug,能处理ajax方式的post请求,但是不能处理form表单的form.submit这种提交,求解决

karosLi commented 4 years ago

form表单form.submit走的不是ajax,ajax hook拦截不到。 有两种方式你可以考虑: 1、替换表单的提交为ajax形式 2、增加黑名单机制,针对这类链接不要使用离线包机制

linwkr commented 4 years ago

@karosLi 2、增加黑名单机制,针对这类链接不要使用离线包机制 问一下这句什么意思? 使用registerSchemeForCustomProtocol方法,并注册NSURLProtocol子类,来加载本地缓存文件。这个应该是整个APP的行为。怎么通过黑名单,来禁止一些链接使用离线包呢

karosLi commented 4 years ago

类似于这样,有一个统一的方法可以开启和关闭离线包功能。是否关闭的逻辑,你可以通过服务器端后台下发一些H5链接的黑名单列表,然后再下面几个入口做判断是否需要关闭离线包功能。

- (void)enableOffineH5:(BOOL)enable {
    if (enable) {
        _jsBridgeEngine.config.enableAjaxHook = YES;
        [NSURLProtocol wkWebView_registerScheme:@"http"];
        [NSURLProtocol wkWebView_registerScheme:@"https"];
    } else {
        _jsBridgeEngine.config.enableAjaxHook = NO;
        [NSURLProtocol wkWebView_unregisterScheme:@"http"];
        [NSURLProtocol wkWebView_unregisterScheme:@"https"];
    }
}
linwkr commented 4 years ago

@karosLi decidePolicyForNavigationAction里做开关,不会发生两个webview同时加载,一个开启缓存,一个不需要缓存,发生需要缓存的资源,请求没有发到本地吗?

karosLi commented 4 years ago

一般的话还是一个webview在加载,你要是有两个webview同时加载加载场景,那就不行。 不过最好还是建议替换表单的提交为ajax形式,避免开关的维护。

linwkr commented 4 years ago

一般的话还是一个webview在加载,你要是有两个webview同时加载加载场景,那就不行。 不过最好还是建议替换表单的提交为ajax形式,避免开关的维护。

大概明白了。谢谢解答

karosLi commented 4 years ago

新的版本 KKJSBridge 1.1.1

可以通过 form.submit() 提交表单了