You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:22:36