问题描述
我们在两种类型的硬件设备上有类似的服务器,我们需要使用 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
}()
我们已经尝试过的事情:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)