Alamofire 5: RequestTaskMap fatalError, когда приложение находится на переднем плане - PullRequest
0 голосов
/ 04 апреля 2020

Я обновляю свой проект для Alamofire 5.0 и получаю cra * sh, когда приложение уже на переднем плане (в отличие от похожих проблем на Github ):

.../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)
    }
}


1 Ответ

0 голосов
/ 05 апреля 2020

Что касается cra sh, было бы лучше сообщить об этом как об ошибке на нашем GitHub с полным стеком cra sh. Если у вас есть проект, который повторяет проблему, мы будем благодарны. По крайней мере, код, из которого вы создаете запросы, может помочь расследованию.

Тем не менее, ваше использование Session, как это, не делает то, что вы думаете, что делает. Прежде всего, код, который вы опубликовали, показывает, что вы используете один и тот же экземпляр Session.default для всех ваших запросов, что, по-видимому, не является вашим намерением. Во-вторых, этот экземпляр является неизменяемым, поэтому вы ничего не можете изменить в диспетчере доверия сервера после создания экземпляра.

Если вы хотите, чтобы пользовательский ServerTrustManager обрабатывал динамические c правила во время выполнения, я предлагаю вам подкласс ServerTrustManager с соответствующими методами и безопасностью потоков и использовать его экземпляр с одним Session экземпляром. вместо нескольких Session экземпляров.

...