it-swarm.com.ru

Ошибка загрузки 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)

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

132
Tariq

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

В 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:Это временный обходной путь, пока вы не будете готовы принять поддержку iOS9 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>
237
Tariq

Как работать с SSL в iOS9 , Одно из решений заключается в следующем:

Как Apple сказать: enter image description hereenter 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

52
ElonChan

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

Надеюсь, это поможет кому-то еще. У нас возникли проблемы с подключением к URL-адресам Amazon S3, которые выглядели совершенно корректными, TLSv12 HTTPS-URL. Оказывается, нам пришлось отключить 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>
39
Ben Kreeger

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

6
David Cespedes

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

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

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

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

 enter image description here

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
3
geet Sebastian

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

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>
2
Sakir Sherasiya

Обновление: 

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

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

1
Ben

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

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

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

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

0
eliprodigy

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

0
Vaishnavi

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

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

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

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

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

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

0
tania_S