// // GDWebURLSessionService.m // DESThreeTest // // Created by Qwerdf on 2025/10/24. // Copyright © 2025 zhang alan. All rights reserved. // #import "GDWebURLSessionService.h" #import "GDWebURLSessionDelegate.h" @implementation GDWebURLSessionService #pragma mark - 初始化 - (instancetype)initWithSchemeTask:(id)task { if (self = [super init]) { _schemeTask = task; } return self; } #pragma mark - GDWebCustomURLSchemeProtocol + (BOOL)canService:(id)task { // 作为默认服务,理论上不需要实现(因为其他服务不处理时才会走到这里) return YES; } - (void)startLoading:(void (^)(void))completion { self.completion = completion; NSURLRequest *request = self.schemeTask.request; // 发起常规网络请求,直接将结果返回给网页 // self.dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // if (error) { // [self.schemeTask didFailWithError:error]; // } else { // [self.schemeTask didReceiveResponse:response]; // if (data) [self.schemeTask didReceiveData:data]; // [self.schemeTask didFinish]; // } // if (completion) completion(); // }]; // [self.dataTask resume]; // =====新增:用自定义 NSURLSession + 代理处理重定)===== // 配置会话(默认配置即可,如需自定义超时、Cookie 可在此调整) NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // 创建自定义代理(关联 schemeTask,用于处理重定向和回调) GDWebURLSessionDelegate *sessionDelegate = [[GDWebURLSessionDelegate alloc] initWithSchemeTask:self.schemeTask completion:completion]; sessionDelegate.stopMarkDic = self.stopMarkDic; // 传递 dic 引用 // 创建会话(绑定代理,delegateQueue 为 nil 表示用默认队列) NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:sessionDelegate delegateQueue:nil]; // 发起请求(替换原 sharedSession 的 dataTask) self.dataTask = [session dataTaskWithRequest:request]; [self.dataTask resume]; } - (void)stopLoading { [self.dataTask cancel]; self.dataTask = nil; self.schemeTask = nil; if (self.completion) self.completion(); } @end