HTTPS-запрос в iOS 9: сбой загрузки HTTP NSURLSession/NSURLConnection (kCFStreamErrorDomainSSL, -9802)
Я обновляю свое приложение, чтобы приспособить новый ATS от Apple. Без каких-либо изменений в Plist-Info, следующий код выдает ошибку в sendSynchronousRequest()
в ванильном симуляторе iOS 9.
NSURL *url =[NSURL URLWithString:@"https://Google.com"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setHTTPMethod:@"GET"];
[request setURL:url];
NSURLResponse *urlResponse = nil;
NSError *error = nil;
NSData *reponse = [NSURLConnection sendSynchronousRequest:request
returningResponse:&urlResponse
error:&error];
Ошибка:
Ошибка загрузки HTTP NSURLSession / NSURLConnection (kCFStreamErrorDomainSSL, -9802)
Есть мысли о том, что может быть за этим вопросом?
PS: я так понимаю NSURLConnection
устарела. Но этот вызов работает, если я добавлю AllowArbitraryLoads
в Plist
,
5 ответов
Ошибка загрузки NSURLSession/NSURLConnection HTTP (kCFStreamErrorDomainSSL, -9802) соответствует серверу, не поддерживающему "Прямая секретность".
Чтобы обойти это, добавьте исключение домена в файл.plist следующим образом:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>test.testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
Я добавил этот код в info.plist, чтобы разрешить любой запрос http:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
В этой статье перечислены все изменения, сделанные Apple для iOS 9 и их реализации:
http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
Если ваше приложение содержит страницу H5, иногда оно также будет иметь эту ошибку.
Требуется не только включить Allow Arbitrary Loads
чтобы исправить это, но также необходимо добавить код ниже в ваш appDelegate.m:
@implementation NSURLRequest(ATS)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
Добавьте следующее в файл info.plist. И замените "My_Base_Url.com" базовым URL-адресом ссылки на ваш веб-сервис. Это должно сделать свое дело.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>My_Base_Url.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSRequiresCertificateTransparency</key>
<false/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
</dict>
</dict>
В соответствии с этим: https://forums.developer.apple.com/message/36842
Правильное исключение для исправления загрузки HTTP не удалось (kCFStreamErrorDomainSSL, -9802):
NSExceptionAllowsInsecureHTTPLoads