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

Пытался запустить существующее приложение на 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


person Tariq    schedule 09.06.2015    source источник
comment
Вы уверены, что ошибка происходит в первой строке?   -  person BSMP    schedule 09.06.2015
comment
Я была такая же проблема. Это, похоже, покрывает проблему: stackoverflow.com/questions/30720813/   -  person phillies2628    schedule 09.06.2015


Ответы (13)


Найдено решение:

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

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

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

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

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

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

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

Update2: Для получения более подробной информации перейдите по следующей ссылке: 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>
person Tariq    schedule 10.06.2015
comment
Имейте в виду, что вы только что полностью избавились от Application Transport Security, поэтому из вашего приложения исчезла одна важная функция iOS 9. Это взлом, и я не удивлюсь, если этот взлом приведет к отклонению вашей заявки. Добавление определенных веб-сайтов в эти словари, скорее всего, будет разрешено. - person gnasher729; 10.06.2015
comment
@StevenPeterson Apple может исключить все приложение только в каждом конкретном случае. Я предполагаю, что если Apple благословит ваше приложение этой возможностью, они попросят вас включить этот ключ. Ожидайте, что Apple будет делать это редко. - person mattyohe; 11.06.2015
comment
Пожалуйста, пожалуйста, пожалуйста, пожалуйста, пожалуйста — не добавляйте исключение в свой plist и не двигайтесь дальше только потому, что оно работает. Позаботьтесь о безопасности данных вашего пользователя и внедрите SSL и другие передовые методы обеспечения безопасности. - person Andrew; 16.06.2015
comment
@ gnasher729, я понимаю, что лучше поддерживать TLS 1.2, чем просто отключать ATS. Однако что делать, если вы полагаетесь на сторонний API/веб-сервис. Я не могу заставить их обновиться, так что я могу сделать?? - person Woodstock; 28.06.2015
comment
подтверждая, что это также сработало для меня при использовании LayerKit SDK - person Scott D; 21.09.2015
comment
@ user1139893: это то, что я пытаюсь сделать с MAMP. До сих пор у меня не получилось. Можете ли вы объяснить мне, как это сделать? - person SagittariusA; 21.09.2015
comment
@mattyohe С помощью этого метода мое приложение было принято без проблем (разрешено любое соединение) - person LS_; 23.10.2015
comment
@Signo Не удивляйтесь, если вы больше не сможете полностью отключить его. - person mattyohe; 23.10.2015
comment
@mattyohe Это не то, что зависит от меня, у фреймворков, которые я использую, есть проблема, поэтому, пока я не смогу их обновить, проблема не исчезнет. и на данный момент это единственное исправление, которое работает - person LS_; 26.10.2015
comment
@Tariq, почему он хорошо работает с NSURLSession, а не с AFNetworking? - person user2526811; 28.12.2015
comment
В этом ответе есть небольшая ошибка: NSTemporaryExceptionMinimumTLSVersion должно быть, например. TLSv1.0 вместо 1.0 см. NSAppTransportSecurity Ключи словаря доменов-исключений - person mbi; 19.01.2016

Как работать с 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, если они еще этого не сделали. Это следует рассматривать как временный обходной путь.

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

Для получения дополнительной информации перейдите на страницу Советы по адаптации iOS9.

person ElonChan    schedule 15.06.2015
comment
SSL и TLS — это разные уровни шифрования, используемые протоколами HTTPS. Таким образом, следует полностью отключить SSL и использовать TLS v1.2 или более позднюю версию. Для получения дополнительной информации я бы рекомендовал начать со следующего ресурса: SSL/TLS Security 2015 — упрощенное краткое руководство - person Conrad Taylor; 16.06.2015
comment
Мне повезло только с нижним примером, где вы установили для NSAllowsArbitraryLoads значение true. Мой сервер использует исключительно TLS v1.2, и мне все еще нужно сделать это, чтобы заставить его работать. Очень расстраивает. - person Scooter; 08.07.2015
comment
Итак, есть ли обходной путь, который я мог бы использовать, чтобы точно знать, что мое новое приложение будет одобрено в App Store, например, прокси-сервис? - person Josh; 27.10.2016

Техническая заметка 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>
person Ben Kreeger    schedule 10.09.2015
comment
Это была моя точная проблема, и она решила ее мгновенно! Благодарить! :) - person Alex Zak; 30.09.2015
comment
Это тоже решает проблему, с которой я столкнулся; Однако в разных случаях могут потребоваться разные настройки. Хорошей новостью является то, что техническая заметка также содержит информацию о том, как использовать nsurl, чтобы помочь вам найти правильные настройки в целом. - person ecotax; 07.10.2015
comment
Мне нужно было сделать то же самое для cloudfront.net, если я использовал CDN перед Amazon S3. - person Raymond26; 09.12.2015

Если у вас возникла такая же проблема с 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

person David Cespedes    schedule 15.10.2015
comment
Да благословит тебя бог братан - person Vervatovskis; 23.02.2017

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

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

<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>
person Ashvin A    schedule 12.06.2015

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

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

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
person geet Sebastian    schedule 10.12.2015
comment
Это разрешит все HTTP-запросы. Работает, но не рекомендуется. - person KVISH; 11.03.2016

Обновлять:

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

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

person Ben    schedule 22.10.2015
comment
Это разрешит все HTTP-запросы. Работает, но не рекомендуется. - person KVISH; 11.03.2016

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

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>
person Sakir Sherasiya    schedule 04.05.2017

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

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

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

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

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

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

person tania_S    schedule 18.09.2015

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

<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>
person KVISH    schedule 11.03.2016

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

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

person eliprodigy    schedule 25.04.2017

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

person Vaishnavi    schedule 04.01.2018
comment
В моем случае я пытался загрузить файл .html. - person Vaishnavi; 04.01.2018

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

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

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
person mohsen    schedule 20.09.2019