Alamofire:错误域=NSURLErrorDomain 代码=-1004“无法连接到服务器”尝试在同一应用会话中从 https 切换到 http

问题描述

我们在两种类型的硬件设备上有类似的服务器,我们需要使用 iOS 应用程序连接到它们。目前,我们使用 Alamofire 4.9.1 来处理所有 API 请求。

以前,我们在服务器上仅支持 http 端点,但最近我们已在最新版本的设备上改用 https。应用需要同时支持两者。

我们面临的问题是,当我们连接到设备 X(支持 https),然后尝试连接到设备 Y(仅支持 http) strong>,我们收到此错误

[Error] GET 'http://172.30.1.1/file.xml' [27.7252 s]:

Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server." UserInfo={​​​​​​​NSUnderlyingError=0x281f2fde0 {​​​​​​​Error Domain=kcfErrorDomainCFNetwork Code=-1004 "(null)" UserInfo={​​​​​​​_kcfStreamErrorCodeKey=61,_kcfStreamErrorDomainKey=1}​​​​​​​}​​​​​​​,NSErrorFailingURLStringKey=https://172.30.1.1/file.xml,NSErrorFailingURLKey=https://172.30.1.1/file.xml,_kcfStreamErrorDomainKey=1,_kcfStreamErrorCodeKey=61,NSLocalizedDescription=Could not connect to the server.}​​​​​​​

直接连接到设备 Y(http) 而不先连接到设备 X(https) 工作正常,如果我们终止应用程序,在出现错误后我们可以连接到设备 Y(http)。即使我们在 Alamofire 中使用不同的 SessionManager 也会发生这种情况。

这是因为我们使用的是同一个IP地址吗?如果我们检查错误 NSErrorFailingURLStringKey,它仍然是 https,尽管我们调用的 url 是 http。

在这里粘贴相关代码

    private var manager: Alamofire.SessionManager = {
        let configuration = URLSessionConfiguration.default
        let manager = Alamofire.SessionManager(configuration: configuration)
        manager.retrier = RetryHandler()
        return manager
    }()

    private var manager2: Alamofire.SessionManager = {
        var serverTrustPolicies: [String: ServerTrustPolicy] = [
            "172.30.1.1": .disableEvaluation
        ]
        let config = URLSessionConfiguration.ephemeral
       
        //Adding TrustManager to Allow All Certificates
        let manager = Alamofire.SessionManager(configuration: config,serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
        manager.adapter = RequestInterceptor()
        manager.retrier = RequestInterceptor()
        
        return manager
    }()

我们已经尝试过的事情:

  • 使用不同的 UrlSessionConfiguration
  • 设置 config.urlCache = nil

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)