#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, чтобы увидеть один пример.