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>

Добавьте новую строку в ваш файл plist.

Добавьте новую строку в ваш файл plist

Я добавил этот код в 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 
Другие вопросы по тегам