Ошибка загрузки HTTP NSURLSession / NSURLConnection на iOS 9


137

Пытался запустить существующее приложение на iOS9, но при использовании не работал AFURLSessionManager.

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

Я получаю следующую ошибку:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Также получаются следующие журналы:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

Обновление: я добавил несколько обновлений в свое решение: ошибка HTTP-загрузки NSURLSession / NSURLConnection на iOS 9


Вы уверены, что ошибка происходит в первой строке?
BSMP

1
Я была такая же проблема. Кажется, это
решило

Ответы:


240

Нашел решение:

В iOS9 ATS применяет передовые методы во время сетевых вызовов, включая использование HTTPS.

Из документации Apple:

ATS предотвращает случайное раскрытие информации, обеспечивает безопасное поведение по умолчанию и проста в использовании. Вам следует принять ATS как можно скорее, независимо от того, создаете ли вы новое приложение или обновляете существующее. Если вы разрабатываете новое приложение, вам следует использовать исключительно HTTPS. Если у вас есть существующее приложение, вы должны использовать HTTPS как можно чаще прямо сейчас и как можно скорее создать план по миграции остальной части приложения.

В бета-версии 1 в настоящее время нет возможности определить это в info.plist. Решение - добавить его вручную:

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

введите описание изображения здесь

Обновление 1: это временный обходной путь, пока вы не будете готовы принять поддержку iOS9 ATS.

Обновление 2: для получения дополнительных сведений перейдите по следующей ссылке: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: если вы пытаетесь подключиться к хосту (YOURHOST.COM), который имеет только TLS 1.0

Добавьте их в Info.plist вашего приложения.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

10
Имейте в виду, что вы только что полностью избавились от Application Transport Security, поэтому одна важная функция iOS 9 просто исчезла из вашего приложения. Это взлом, и я не удивлюсь, если этот взлом приведет к отклонению вашего приложения. Добавление определенных веб-сайтов в эти словари, скорее всего, будет разрешено.
gnasher729

2
@StevenPeterson Вы сможете исключить приложение целиком только в индивидуальном порядке Apple. Я предполагаю, что если Apple благословит ваше приложение этой возможностью, они попросят вас включить этот ключ. Ожидайте, что Apple будет делать это редко.
mattyohe

8
Пожалуйста, пожалуйста, пожалуйста, пожалуйста - не просто добавляйте исключение в свой список и двигайтесь дальше «просто потому, что оно работает». Подумайте о безопасности данных вашего пользователя и внедрите SSL и другие передовые методы безопасности.
Санта-Клаус

8
@ gnasher729, я так понимаю лучше поддерживать TLS 1.2, а не просто отключать ATS. Однако что вы можете сделать, если полагаетесь на сторонний API / веб-сервис. Я не могу заставить их обновиться, что мне делать?
Woodstock

7
В этом ответе NSTemporaryExceptionMinimumTLSVersionесть небольшая ошибка: должен быть, например, TLSv1.0 вместо 1.0 , см. Ключи словаря доменов
mbi

54

Как работать с SSL в iOS9 , Одно из решений:

Как говорят в Apple : введите описание изображения здесь введите описание изображения здесь

введите описание изображения здесь

iOS 9 и OSX 10.11 требуют TLSv1.2 SSL для всех хостов, с которых вы планируете запрашивать данные, если вы не укажете домены исключений в файле Info.plist вашего приложения.

Синтаксис конфигурации Info.plist выглядит так:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Если вашему приложению (например, стороннему веб-браузеру) необходимо подключаться к произвольным хостам, вы можете настроить его следующим образом:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Если вам нужно это сделать, вероятно, лучше всего обновить свои серверы, чтобы использовать TLSv1.2 и SSL, если они еще не сделали этого. Это следует рассматривать как временное решение.

На сегодняшний день в предварительной документации не упоминаются какие-либо из этих параметров конфигурации каким-либо образом. Как только это произойдет, я обновлю ответ, добавив ссылку на соответствующую документацию.

Для получения дополнительной информации перейдите к iOS9AdaptationTips


4
SSL и TLS - это разные уровни шифрования, используемые протоколами HTTPS. Таким образом, следует полностью отключить SSL и использовать TLS v1.2 или новее. Для получения дополнительной информации я бы рекомендовал начать со следующего ресурса: SSL / TLS Security 2015 - Упрощенное краткое руководство
Конрад Тейлор,

2
Я добавил удачи только в нижнем примере, где вы устанавливаете NSAllowsArbitraryLoads в значение true. Мой сервер использует исключительно TLS v1.2, и мне все еще нужно это сделать, чтобы он заработал. Очень неприятно.
Scooter

1
Итак, есть ли какой-нибудь обходной путь, который я мог бы использовать, чтобы точно знать, что мое новое приложение будет одобрено в App Store, например, прокси-сервис?
Джош

41

Technote от Apple по безопасности транспорта приложений очень удобен ; это помогло нам найти более безопасное решение нашей проблемы.

Надеюсь, это поможет кому-то другому. У нас возникли проблемы с подключением к URL-адресам Amazon S3, которые оказались совершенно действительными, URL-адресами TLSv12 HTTPS. Оказывается, нам пришлось отключить, NSExceptionRequiresForwardSecrecyчтобы включить еще несколько шифров, которые использует S3.

В нашем Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

Это была моя точная проблема, и она решена мгновенно! Спасибо! :)
Alex Zak

Это решает и мою проблему; в разных случаях могут потребоваться разные настройки. Хорошей новостью является то, что технический комментарий также содержит информацию о том, как использовать nsurl, чтобы помочь вам найти правильные настройки в целом.
экотакс

Мне нужно было сделать то же самое для cloudfront.net, если я использовал CDN перед Amazon S3.
Raymond26,

7

Если у вас возникла проблема с Amazon S3, как у меня, попробуйте вставить это в свой info.plist как прямой дочерний элемент вашего тега верхнего уровня.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

Вы можете найти дополнительную информацию по адресу:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue


2
Да благословит тебя Бог, братан
Верватовскис

5

Я нашел решение здесь. И это работает для меня.

Проверьте это, это может вам помочь.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.com</key>
                    <dict>
                      <!--Include to allow subdomains-->
                      <key>NSIncludesSubdomains</key>
                      <true/>
                      <!--Include to allow HTTP requests-->
                      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                      <true/>
                      <!--Include to specify minimum TLS version-->
                      <key>NSTemporaryExceptionMinimumTLSVersion</key>
                      <string>TLSv1.1</string>
                </dict>
          </dict>
</dict>

4

Просто добавьте следующие поля в свой файл .plist

введите описание изображения здесь

Синтаксис выглядит так:

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

Это разрешит все HTTP-запросы. Работает, но не рекомендуется.
КВИШ

2

Обновить:

Начиная с Xcode 7.1, вам не нужно вручную вводить NSAppTransportSecurityсловарь в info.plist.

Теперь он выполнит автозаполнение для вас, поймет, что это словарь, а затем также автоматически заполнит Allows Arbitraryнагрузки. info.plist скриншот


Это разрешит все HTTP-запросы. Работает, но не рекомендуется.
KVISH

2

Устранить ошибку NSURLConnection Http load failed Просто добавьте следующий Dict в info.plist:

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

1

Я решил это, добавив ключ в info.plist. Я выполнил следующие шаги:

Я открыл файл info.plist своего проекта

Добавлен ключ NSAppTransportSecurity в качестве словаря.

Добавлен подраздел под названием NSAllowsArbitraryLoads как Boolean и установлен для него значение YES, как показано на следующем рисунке. введите описание изображения здесь

Очистите проект, и теперь все работает нормально, как и раньше.

Ссылка: https://stackoverflow.com/a/32609970


1

Вот что у меня сработало, когда у меня была эта ошибка:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

Вы можете попробовать добавить эту функцию в файл RCTHTTPRequestHandler.m

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }


1

В дополнение к вышеупомянутым ответам еще раз проверьте свой URL


В моем случае я пытался загрузить файл .html.
Vaishnavi

0

Вы должны добавить App Transport Security Settingsк info.plistи добавить Allow Arbitrary LoadsкApp Transport Security Settings

введите описание изображения здесь

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.