ЭТО НЕ ПОВТОРЯЮЩИЙСЯ ВОПРОС, ЧИТАЙТЕ ДАЛЬШЕ. Я обновляю устаревший код в своем приложении до соответствия iOS10.
ОШИБКА: NSURLSession доставляет мне неприятности с этой печально известной ошибкой, наряду с 9806 и 9801, в зависимости от того, что я поместил в файл .plist:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
МОЙ КОД: В моем файле Info.plist у меня есть:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>https://my.own-server.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowInsecureHTTPSLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSThirdPartyExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
</dict>
</dict>
В моем коде ObjectiveC у меня есть это:
NSURLSessionConfiguration *defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session __unused = [NSURLSession sessionWithConfiguration:defaultConfiguration delegate:[PortalRequest alloc] delegateQueue:[NSOperationQueue mainQueue]]; operationQueue:[NSOperationQueue mainQueue]];
requestContainer.sessionDataTask = [session dataTaskWithRequest:request];
[self.sessionDataTask resume];
В методе DELEGATE класса, в котором выполняется вызов URLSession, я вижу didReceiveChallenge:
LOG: ** NSURLSession IOS10 ** - didReceiveChallenge called
... и, наконец, я получаю сообщение об ошибке:
[TIMESTAMP] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9806)
СЕРВЕР Ни одно из решений, предложенных в других ответах, не работает, это из-за крайнего срока Apple в 2017 году? https://techcrunch.com/2016/06/14/apple-will-require-https-connections-for-ios-apps-by-the-end-of-2016/ В соответствии с этим интерактивный инструмент анализа безопасности, https://www.ssllabs.com/ssltest/analyze.html Серверная часть ПОДДЕРЖИВАЕТ TLS 1.2
Любые идеи о том, как решить эту проблему?? Вы знаете, где найти пример кода iOS, чтобы быть на 100% уверенным, что конечная точка, на которую я указываю, свободна от вины?
ОБНОВЛЕНИЕ Этот код работает для меня, есть мнения по этому поводу?:
- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler{
NSLog(@"*** KBRequest.NSURLSessionDelegate - didReceiveChallenge IOS10");
if([challenge.protectionSpace.authenticationMethod
isEqualToString:NSURLAuthenticationMethodServerTrust])
{
if([challenge.protectionSpace.host
isEqualToString:@"engine.hello-indigo.com"])
{
NSURLCredential *credential =
[NSURLCredential credentialForTrust:
challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
}
else
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}
}