«Произошла ошибка SSL и невозможно создать безопасное соединение с сервером».

В iOS 10.2 мы устраняем эту ошибку, когда пытаемся связаться с несколькими разными apis. Самое странное в том, что мы иногда встречаем это, в ~ 2 из 200 запросов к одному и тому же URL. Но, с другой стороны, я иногда могу делать 3000 апи-звонков, не видя вопроса.

Насколько я читал, это связано с ATS. Результат также показывает нам, что мы получаем код ошибки, который относится к ATS: kCFStreamErrorCodeKey = -9806.

Однако я не понимаю, как это может относиться к ATS, из-за нескольких пунктов:

  • URL-адрес, который я вызываю, – https.
  • Сервер имеет действительный сертификат TLSv1.2
  • Я попытался создать исключение, но он ничего не делает

Мы попытались создать исключение по-разному, как путем разрешения суровых нагрузок, так и создали исключение для домена.

Даже если это не обязательно, если у сервера есть действительный сертификат, мы попытались создать исключение

Так мы создали исключение для домена.

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>deezer.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict> 

И именно так мы включили суровые нагрузки:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

Еще одна странность в том, что мы используем это только в iOS 10 (10.2). Когда мы тестируем в iOS 9.3, все работает так, как ожидалось.

Я сделал пример приложения, чтобы воспроизвести это.

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self Perform]; } int i = 0; - (void) Perform { NSURLSessionConfiguration *defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *sessionWithoutADelegate = [NSURLSession sessionWithConfiguration:defaultConfiguration]; NSURL *url = [NSURL URLWithString:(@"https://api.deezer.com/chart/0/tracks")]; [[sessionWithoutADelegate dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if(error != NULL) { NSLog(@"Got response with error %@.\n", error); } NSLog(@"%d",i); i++; if(i <1000) { [self Perform]; } }] resume]; } 

Кто-нибудь имеет идеи для решений? благодаря

Давайте будем гением компьютера.