URLError из-за отклонения URLAuthenticationChallenge слишком общий ⇐ IOS
-
Anonymous
URLError из-за отклонения URLAuthenticationChallenge слишком общий
Согласно этой статье, при безопасном обмене данными с аппаратными аксессуарами в локальной сети через HTTPS вы должны закреплять свои сертификаты следующим образом:
В URLSessionDelegate реализуйте этот метод:
func urlSession(_ session: URLSession, DidReceive Challenge: URLAuthenticationChallenge) async -> (URLSession.AuthChallengeDisposition, URLCredential?) Затем выполните проверку через SecTrustEvaluateWithError и верните (.useCredential, URLCredential(trust:trust)), если она прошла успешно, и (.cancelAuthenticationChallenge, nil) если это не так.
Однако ошибка, возвращаемая при отклонении запроса в try await URLSession(...).data(from:), представляет собой URLError с кодом -999, который является URLError.Code.cancelled.
Как отличить другие отмены, чтобы сообщить пользователю, что запрос не выполнен из-за недействительного сертификата? Документация по URLError.Code.cancelled очень общая, поэтому я не могу полагаться исключительно на эту ошибку (или могу?).
В этой статье предлагается показывать ошибку прямо в URLSessionDelegate, что мне не кажется хорошим решением, поскольку код пользовательского интерфейса может просачиваться в сетевой код.
Есть ли какие-либо другие методы, которые я мог бы применить здесь, чтобы конкретно отловить ошибку из URLSession, когда сертификат был отклонен моей собственной логикой проверки?
Согласно этой статье, при безопасном обмене данными с аппаратными аксессуарами в локальной сети через HTTPS вы должны закреплять свои сертификаты следующим образом:
В URLSessionDelegate реализуйте этот метод:
func urlSession(_ session: URLSession, DidReceive Challenge: URLAuthenticationChallenge) async -> (URLSession.AuthChallengeDisposition, URLCredential?) Затем выполните проверку через SecTrustEvaluateWithError и верните (.useCredential, URLCredential(trust:trust)), если она прошла успешно, и (.cancelAuthenticationChallenge, nil) если это не так.
Однако ошибка, возвращаемая при отклонении запроса в try await URLSession(...).data(from:), представляет собой URLError с кодом -999, который является URLError.Code.cancelled.
Как отличить другие отмены, чтобы сообщить пользователю, что запрос не выполнен из-за недействительного сертификата? Документация по URLError.Code.cancelled очень общая, поэтому я не могу полагаться исключительно на эту ошибку (или могу?).
В этой статье предлагается показывать ошибку прямо в URLSessionDelegate, что мне не кажется хорошим решением, поскольку код пользовательского интерфейса может просачиваться в сетевой код.
Есть ли какие-либо другие методы, которые я мог бы применить здесь, чтобы конкретно отловить ошибку из URLSession, когда сертификат был отклонен моей собственной логикой проверки?
Мобильная версия