iOS下的网络请求大多用的AFNetworking这个库,该库实现了
NSURLSessionDelegate
和
NSURLSessionTaskDelegate的代理方法,
文档里给到的用域名把IP替换回来的方案是在
NSURLSessionTaskDelegate 的回调方法里
,
AFNetworking因为实现了
NSURLSessionDelegate,
所以关于SSL握手阶段验证证书的回调全部走的
URLSession:
didReceiveChallenge:
completionHandler:
这个方法,问题是这个方法是没有回传Request的,拿不到对应HTTP请求的header,所以好像没法继续进行了,求版主帮忙看看?
正常是可以这么做的:
NSString * host = [[task.currentRequest allHTTPHeaderFields] objectForKey:@"Host"];
现在拿不到这个task,也就拿不到request,怎么办捏
if (!host) {
host = task.currentRequest.URL.host;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在AFNetworking中,虽然URLSession:didReceiveChallenge:completionHandler:
方法没有直接提供request信息,但你仍然可以通过其他方式间接获取到请求的header信息。具体来说,你可以通过自定义的AFSecurityPolicy
来实现对证书验证的控制,并且在这个过程中访问到请求的header。
下面是一个示例步骤,展示如何在AFNetworking中自定义安全策略以访问请求的header:
#import <AFNetworking/AFSecurityPolicy.h>
@interface CustomSecurityPolicy : AFSecurityPolicy
@end
@implementation CustomSecurityPolicy
// 重写或新增方法以处理证书验证并访问Request的Header
// 注意:这里的代码是示意性的,实际逻辑需要根据你的需求调整
- (void)evaluateServerTrust:(nullable SecTrustRef)serverTrust
forDomain:(NSString *)domain
completionHandler:(void(^)(BOOL trusted, NSError * _Nullable error))completionHandler {
// 在这里,你可以在执行验证之前获取到当前的请求
id<NSURLSessionTaskDelegate> taskDelegate = self.manager.session.delegate;
if ([taskDelegate respondsToSelector:@selector(urlSession:task:didReceiveChallenge:completionHandler:)]) {
NSURLSessionTask *currentTask = ...; // 这里需要一种方式来获取当前正在进行的task,这可能需要你维护一个task的引用或者通过其他机制
if (currentTask) {
NSDictionary *headerFields = currentTask.currentRequest.allHTTPHeaderFields;
NSString *host = headerFields[@"Host"];
// 现在你有了header信息,可以进行后续操作
}
}
// 继续执行默认的证书验证逻辑或者你自定义的逻辑
[super evaluateServerTrust:serverTrust forDomain:domain completionHandler:completionHandler];
}
@end
CustomSecurityPolicy
。AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://your-base-url"]];
manager.securityPolicy = [[CustomSecurityPolicy alloc] init];
// 其他配置...
请注意,上述代码中的currentTask
变量获取可能是个挑战,因为直接在evaluateServerTrust:forDomain:completionHandler:
方法中不容易直接获得当前执行任务的引用。这通常需要你在发起请求时保存对任务的引用,或者探索AFNetworking内部是否有可利用的机制来间接获取。如果直接获取NSURLSessionTask
对象有困难,可能需要考虑是否有必要在该阶段访问请求头,或者寻找其他途径来满足你的需求。