我正在为Alamofire 5.0更新我的项目,当应用程序已经在前台时发生崩溃(与similar issues onGithub相反:]
.../Pods/Alamofire/Source/RequestTaskMap.swift, line 115
Fatal error: RequestTaskMap consistency error: no events corresponding to task found.
我正在使用多个管理器来处理仅在运行时才知道的URL的自签名证书(外部API的限制)。我针对该URL实例化了一个经理,并将其保留在内存中,而不是每次都创建一个新经理。为什么我的应用现在崩溃了?
我的设置代码:
public final class ServerConfiguration {
typealias JointSessionManager = SubSessionManager & Alamofire.Session
enum ManagerType: Equatable {
case first(url: String)
case second(url: String)
}
public static var shared: ServerConfiguration!
private var managers: [JointSessionManager] = []
func sessionManagerFor(_ type: ManagerType) -> JointSessionManager {
if let existing = managers.first(where: { $0.type == type }) {
return existing
} else {
let newManager: JointSessionManager
switch type {
case .first(let url):
newManager = FirstSessionManager(url: url, secret: "superSecret")
case .second(let url):
newManager = SecondSessionManager(url: url)
}
managers.append(newManager)
return newManager
}
}
}
protocol SubSessionManager {
var type: ServerConfiguration.ManagerType { get }
}
final class FirstSessionManager: Alamofire.Session, SubSessionManager {
let type: ServerConfiguration.ManagerType
init(url: String, secret: String) {
self.type = .first(url: url)
let serverTrustManager = ServerTrustManager(evaluators: [url: DisabledEvaluator()])
super.init(session: Session.default.session, delegate: Session.default.delegate,
rootQueue: Session.default.rootQueue, interceptor: FirstRequestAdapter(secret: secret),
serverTrustManager: serverTrustManager)
}
}
final class SecondSessionManager: Alamofire.Session, SubSessionManager {
let type: ServerConfiguration.ManagerType
init(url: String) {
self.type = .second(url: url)
let serverTrustManager = ServerTrustManager(evaluators: [url: DisabledEvaluator()])
super.init(session: Session.default.session, delegate: Session.default.delegate,
rootQueue: Session.default.rootQueue, serverTrustManager: serverTrustManager)
}
}
关于崩溃,最好将其报告为具有完整崩溃堆栈的our GitHub上的错误。如果您有一个复制问题的项目,我们将不胜感激。至少,您从中创建请求的代码可能有助于调查。
但是,您对Session
的这种使用方式并没有达到您认为的目的。首先,您发布的代码向您显示了对所有请求使用相同的Session.default
实例,这似乎并不是您的意图。其次,该实例是不可变的,因此在创建实例之后,您将无法更改有关服务器信任管理器的任何内容。
[如果您希望自定义ServerTrustManager
在运行时处理动态规则,建议您使用适当的方法和线程安全性将ServerTrustManager
子类化,并使用单个Session
实例(而不是多个Session
)使用它的实例实例。