karosLi / KKJSBridge

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

ajax hook 之后,H5 图片上传获取不到进度信息,这个有好的方式解决吗 #55

Closed Huiz110 closed 3 years ago

Huiz110 commented 3 years ago
- (NSURLSessionDataTask *)normalDataTastWithRequest:(NSURLRequest *)request callbackDelegate:(NSObject<KKJSBridgeAjaxDelegate> *)callbackDelegate {
    return [[self.class ajaxSesstionManager] dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        // 处理响应数据
        [callbackDelegate JSBridgeAjax:callbackDelegate didReceiveResponse:response];
        if ([responseObject isKindOfClass:NSData.class]) {
            [callbackDelegate JSBridgeAjax:callbackDelegate didReceiveData:responseObject];
        } else if ([responseObject isKindOfClass:NSDictionary.class]) {
            NSData *responseData = [NSJSONSerialization dataWithJSONObject:responseObject options:0 error:nil];
            [callbackDelegate JSBridgeAjax:callbackDelegate didReceiveData:responseData];
        } else {
            NSData *responseData = [NSJSONSerialization dataWithJSONObject:@{} options:0 error:nil];
            [callbackDelegate JSBridgeAjax:callbackDelegate didReceiveData:responseData];
        }
        [callbackDelegate JSBridgeAjax:callbackDelegate didCompleteWithError:error];
    }];;
}

看代码里,没有实现进度相关的回调,NSURLProtocol 中也没有进度相关的方法

karosLi commented 3 years ago

嗯,这个没有太好的方案。建议使用JSBridge提供给H5选择照片的能力

Huiz110 commented 3 years ago

嗯,这个没有太好的方案。建议使用JSBridge提供给H5选择照片的能力

这个已经支持了,但是交互需要展示图片上传远端的进度,这个目前没有好的方案解决,因为上传请求会被 hook

karosLi commented 3 years ago

是的

karosLi commented 3 years ago

你可以考虑在选择照片组件里显示上传进度

Huiz110 commented 3 years ago

你可以考虑在选择照片组件里显示上传进度

目前交互需求是在 H5 页面上展示上传进度,因为选择完照片后不一定要立即上传。 原生能否增加类似白名单配置、或者让 H5 设置某个请求不进行 hook,目前这个配置都是全局的。 类似下面代码,针对某个 request 或 path 来设置白名单

+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    // 看看是否已经处理过了,防止无限循环
    if ([NSURLProtocol propertyForKey:kKKJSBridgeNSURLProtocolKey inRequest:request]) {
        return NO;
    }
}
karosLi commented 3 years ago

这里是设不了白名单的。可以通过后台下发白名单列表,然后在 WebViewVC 入口的地方来控制是否需要 ajax hook

Huiz110 commented 3 years ago

这里是设不了白名单的。可以通过后台下发白名单列表,然后在 WebViewVC 入口的地方来控制是否需要 ajax hook

目前改为只在使用离线缓存、或需要本地资源拦截的页面,开启 hook 了,其他页面关闭 ajax hook 以及 URLProtocol 的注册,感谢~

karosLi commented 3 years ago

不客气

DarrenKong commented 6 months ago

// 在跨域的情况下,非简单请求会先发起一次空body的OPTIONS请求,称为"预检"请求,用于向服务器请求权限信息,等预检请求被成功响应后,才发起真正的http请求。 if (bodyReqeust && ![mutableReqeust.HTTPMethod isEqualToString:@"OPTIONS"]) { // 从把缓存的 body 设置给 request [KKJSBridgeAjaxBodyHelper setBodyRequest:bodyReqeust toRequest:mutableReqeust]; }