Alamofire ssl неправильно: сессия инициализирована

#swift #https #certificate #alamofire

#swift #https #сертификат #alamofire

Вопрос:

Я пытаюсь подключиться к своему https-серверу, который использует пользовательский сертификат (экспорт на сервере.сертификат p12).

Вот мой код:

 let filePath = Bundle.main.path(forResource: "ch-server", ofType: "cer")
let data = try! Data(contentsOf: URL(fileURLWithPath: filePath!))
let certificate = SecCertificateCreateWithData(nil, data as CFData)!
let pinEvaluator = PinnedCertificatesTrustEvaluator(certificates: [certificate], acceptSelfSignedCertificates: true, performDefaultValidation: true, validateHost: true)
let trustManager = ServerTrustManager(evaluators: [CHConstants.ApiHost: pinEvaluator])
let session = Session(serverTrustManager: trustManager)
        
session.request(url, method: .post, parameters: ["phone", phone], encoder: JSONParameterEncoder.default, headers: headers).responseJSON { response in
    switch response.result {
    case .success:
        print("data:(response.data)")
    case let .failure(error):
        print("error:(error)")
    }
}
        
//        AF.request(url, method: .post, parameters: ["phone", phone], encoder: JSONParameterEncoder.default, headers: headers).responseJSON { response in
//            switch response.result {
//            case .success:
//                print(response.data)
//            case let .failure(error):
//                print(error)
//            }
//        }
  

но ответ — ошибка:

 error:sessionDeinitialized
  

Комментарии:

1. Если вы хотите закрепить свой самозаверяющий сертификат, и у вас есть .cer файл в вашей цели, вы можете сократить создание вашего pinEvaluator примерно до этого: let pinEvaluator = PinnedCertificatesTrustEvaluator(acceptSelfSignedCertificates: true, performDefaultValidation: false, validateHost: true)

2. как вы это исправили?

Ответ №1:

Вам нужно поддерживать свой Session экземпляр в рабочем состоянии. В противном случае он будет немедленно деинициализирован, а ваши запросы будут отменены, на что указывает эта ошибка. Чаще всего это делается с помощью одноэлементного или другого шаблона ссылочного хранилища.

Комментарии:

1. Определяем конечный класс и глобальную переменную ‘session’, затем инициализируем класс, используя static. Это правильно?

2. Так много людей говорят, что нужно поддерживать его как одноэлементный — это звучит как отличная идея, но ни один из этих вопросов на самом деле не объясняет, как это сделать!

3. @whendon Существует множество примеров того, как создавать долговечные ссылки, такие как синглтоны, в Swift. Я не включил его здесь, потому что синглтон может быть не тем, что вам нужно для вашего конкретного использования. Если ничего другого, просто посмотрите на AF экземпляр, который предоставляет Alamofire, чтобы увидеть один пример.