使用Alamofire无法获取SSL与HTTP协议类型的排查求助
问题排查:Alamofire中无法获取SSL/HTTP协议类型数据
我在项目中使用Alamofire进行网络请求,需要从请求中提取设备使用的SSL加密协议类型与HTTP协议类型数据。尝试借助Alamofire的API,通过ClosureEventMonitor监听taskDidFinishCollectingMetrics事件,从中获取URLSessionTaskTransactionMetrics对象,但该对象的negotiatedTLSProtocolVersion和networkProtocolName字段始终为空。不过通过Proxyman抓包已确认这些值是存在的。
代码概览如下:
class AlamofireNetworkProvider { private let additionalHeaders: NetworkDefaultHeaders? private var session: Session let monitor: ClosureEventMonitor = { let monitor = ClosureEventMonitor() monitor.taskDidFinishCollectingMetrics = { session, task, metrics in metrics.transactionMetrics.forEach { metric in // 尝试获取协议信息 print(metric.negotiatedTLSProtocolVersion) print(metric.networkProtocolName) } } return monitor }() init(additionalHeaders: NetworkDefaultHeaders?) { self.additionalHeaders = additionalHeaders self.session = Session(interceptor: ConnectionLostRetryPolicy(), eventMonitors: [monitor]) } // 执行网络请求的方法... }
环境信息:
- Alamofire版本:5.7.1
- 最低支持iOS版本:15
排查方向与解决方法
1. 开启Session的Metrics收集配置
Alamofire的Session默认配置可能未完全启用Metrics收集,需手动配置URLSessionConfiguration确保相关功能开启:
let configuration = URLSessionConfiguration.default // 显式启用会话事件与Metrics收集 configuration.sessionSendsLaunchEvents = true // 其他必要配置可根据需求添加 configuration.waitsForConnectivity = true self.session = Session(configuration: configuration, interceptor: ConnectionLostRetryPolicy(), eventMonitors: [monitor])
2. 过滤重定向事务
transactionMetrics包含所有请求事务(包括重定向请求),重定向请求可能没有完整的TLS/HTTP协议信息,需过滤出主请求事务:
monitor.taskDidFinishCollectingMetrics = { session, task, metrics in metrics.transactionMetrics.forEach { metric in // 只处理无重定向的主请求事务 if metric.redirectCount == 0 { print(metric.negotiatedTLSProtocolVersion ?? "未获取到TLS协议") print(metric.networkProtocolName ?? "未获取到HTTP协议") } } }
3. 验证请求的HTTPS属性
如果请求是HTTP而非HTTPS,negotiatedTLSProtocolVersion必然为空。确认请求URL以https://开头,且Proxyman中抓取的是该请求的协议数据。
4. 直接自定义SessionDelegate监听
若Alamofire的Monitor方式存在兼容问题,可直接自定义SessionDelegate来监听Metrics:
class CustomSessionDelegate: SessionDelegate { override func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { super.urlSession(session, task: task, didFinishCollecting: metrics) metrics.transactionMetrics.forEach { metric in if metric.redirectCount == 0 { print(metric.negotiatedTLSProtocolVersion) print(metric.networkProtocolName) } } } } // 初始化Session时使用自定义Delegate let customDelegate = CustomSessionDelegate() self.session = Session(delegate: customDelegate, interceptor: ConnectionLostRetryPolicy(), eventMonitors: [monitor])
5. 升级Alamofire版本
5.7.1版本可能在iOS15上存在URLSessionTaskTransactionMetrics字段的兼容问题,建议升级到最新稳定版(如5.8.x系列),验证是否修复相关问题。
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

