[Alamofire 5:应用在前景中时出现RequestTaskMap fatalError

问题描述 投票:0回答:1

我正在为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)
    }
}


ios swift alamofire
1个回答
0
投票

关于崩溃,最好将其报告为具有完整崩溃堆栈的our GitHub上的错误。如果您有一个复制问题的项目,我们将不胜感激。至少,您从中创建请求的代码可能有助于调查。

但是,您对Session的这种使用方式并没有达到您认为的目的。首先,您发布的代码向您显示了对所有请求使用相同的Session.default实例,这似乎并不是您的意图。其次,该实例是不可变的,因此在创建实例之后,您将无法更改有关服务器信任管理器的任何内容。

[如果您希望自定义ServerTrustManager在运行时处理动态规则,建议您使用适当的方法和线程安全性将ServerTrustManager子类化,并使用单个Session实例(而不是多个Session)使用它的实例实例。

© www.soinside.com 2019 - 2024. All rights reserved.