NSURLSession/NSURLConnection Ошибка загрузки HTTP на 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)

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

Ответ 1

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

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

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

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

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

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

enter image description here

Update1: Это временное решение, пока вы не будете готовы к поддержке ITS9 ATS.

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>

Ответ 2

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

Как Apple говорят:   enter image description here enter image description here

enter image description here

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

Ответ 3

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

Надеюсь, это поможет кому-то другому. У нас возникли проблемы с подключением к 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>

Ответ 4

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

Ответ 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>

Ответ 6

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

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

Синтаксис выглядит следующим образом:

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

Ответ 7

Обновление:

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

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

Ответ 8

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

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

Ответ 9

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

Я открыл файл project.plist проекта

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

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

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

Ссылка ссылки: fooobar.com/questions/18895/...

Ответ 10

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

<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>

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

enter image description here

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