Falha no carregamento do NSURLSession / NSURLConnection HTTP no iOS 9


137

Tentei executar meu aplicativo existente no iOS9, mas com falha ao usar AFURLSessionManager .

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

    } else {

    }
}];

[task resume];

Estou tendo o erro a seguir:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Também obtendo os seguintes logs:

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

Atualização: adicionei várias atualizações à minha solução: Falha no carregamento do NSURLSession / NSURLConnection no iOS 9


Você tem certeza de que o erro está acontecendo na primeira linha?
BSMP

1
Eu tive o mesmo problema. Este parecia cobrir a questão: stackoverflow.com/questions/30720813/...
phillies2628

Respostas:


240

Solução encontrada:

No iOS9, o ATS aplica as melhores práticas durante as chamadas de rede, incluindo o uso de HTTPS.

Da documentação da Apple:

O ATS evita a divulgação acidental, fornece comportamento padrão seguro e é fácil de adotar. Você deve adotar o ATS o mais rápido possível, independentemente de criar um novo aplicativo ou atualizar um existente. Se você estiver desenvolvendo um novo aplicativo, use HTTPS exclusivamente. Se você já possui um aplicativo, deve usar o HTTPS o máximo possível no momento e criar um plano para migrar o restante do seu aplicativo o mais rápido possível.

Na versão beta 1, atualmente não há como definir isso no info.plist. A solução é adicioná-lo manualmente:

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

insira a descrição da imagem aqui

Atualização 1: esta é uma solução temporária até que você esteja pronto para adotar o suporte ao iOS9 ATS.

Atualização2: para obter mais detalhes, consulte o seguinte link: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: se você está tentando se conectar a um host (YOURHOST.COM) que possui apenas o TLS 1.0

Adicione-os ao Info.plist do seu aplicativo

<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
Lembre-se de que você acabou de se livrar completamente do Application Transport Security, portanto, um dos principais recursos do iOS 9 acabou de sair do seu aplicativo. Isso é um hack, e eu não ficaria surpreso se esse hack tivesse seu ap rejeitado. A adição de sites específicos a esses dicionários provavelmente será permitida.
gnasher729

2
@StevenPeterson Você só poderá excluir um aplicativo inteiro caso a caso pela Apple. Presumo que, se a Apple abençoar seu aplicativo com essa capacidade, eles instruirão você a incluir essa chave. Espere que a Apple faça isso raramente.
mattyohe

8
Por favor, por favor, por favor, por favor, por favor - não basta adicionar a exceção à sua lista e seguir em frente "apenas porque funciona". Considere a segurança dos dados do usuário e implemente SSL e outras práticas recomendadas de segurança.
Papai Noel

8
@ gnasher729, entendo que é melhor dar suporte ao TLS 1.2, em vez de apenas desativar o ATS. No entanto, o que você pode fazer se contar com um serviço de API / web de terceiros. Não consigo forçá-los a atualizar, então o que posso fazer?
Woodstock

7
Há um bug sutil nesta resposta: NSTemporaryExceptionMinimumTLSVersiondeve ser, por exemplo, TLSv1.0 em vez de 1.0 , consulte Chaves de dicionário de domínios de exceção de
mbi

54

Como lidar com o SSL no iOS9 , Uma solução é:

Como a Apple diz: insira a descrição da imagem aqui insira a descrição da imagem aqui

insira a descrição da imagem aqui

O iOS 9 e o OSX 10.11 exigem SSL TLSv1.2 para todos os hosts dos quais você planeja solicitar dados, a menos que você especifique domínios de exceção no arquivo Info.plist do seu aplicativo.

A sintaxe da configuração do Info.plist é semelhante a esta:

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

Se seu aplicativo (um navegador da web de terceiros, por exemplo) precisar se conectar a hosts arbitrários, você poderá configurá-lo da seguinte maneira:

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

Se você precisar fazer isso, provavelmente é melhor atualizar seus servidores para usar TLSv1.2 e SSL, caso ainda não o estejam fazendo. Isso deve ser considerado uma solução temporária.

Atualmente, a documentação de pré-lançamento não menciona nenhuma dessas opções de configuração de nenhuma maneira específica. Depois disso, atualizarei a resposta para vincular à documentação relevante.

Para mais informações, acesse iOS9AdaptationTips


4
SSL e TLS são diferentes camadas de criptografia usadas pelos protocolos HTTPS. Portanto, deve-se desativar completamente o SSL e usar o TLS v1.2 ou posterior. Para mais informações, eu recomendo começando com o seguinte recurso: SSL / TLS Segurança 2015 - Um Guia Rápido Simplificado
Conrad Taylor

2
Eu apenas adicionei alguma sorte ao exemplo inferior, em que você define NSAllowsArbitraryLoads como true. Meu servidor está usando o TLS v1.2 exclusivamente e ainda preciso fazer isso para que ele funcione. Muito frustrante.
Scooter

1
Existe alguma solução alternativa que eu possa usar para ter certeza de que meu novo aplicativo será aprovado na App Store, como um serviço de proxy?
26416 Josh

41

A Nota Técnica da Apple sobre App Transport Security é muito útil ; nos ajudou a encontrar uma solução mais segura para o nosso problema.

Espero que isso ajude outra pessoa. Estávamos tendo problemas para conectar-se a URLs do Amazon S3 que pareciam perfeitamente válidos, URLs TLSv12 HTTPS. Acontece que tivemos que desativar NSExceptionRequiresForwardSecrecypara ativar outro conjunto de cifras que o S3 usa.

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

Este foi o meu problema exato e o corrigiu instantaneamente! Obrigado! :)
Alex Zak

Isso resolve o problema que eu também tinha; casos diferentes podem exigir configurações diferentes. A boa notícia é que ele também contém informações sobre como usar o nsurl para ajudá-lo a encontrar as configurações corretas em geral.
Ecotax #

Eu precisava fazer o mesmo com o cloudfront.net se eu usasse uma CDN na frente do Amazon S3.
Raymond26

7

Se você está tendo esse problema com o Amazon S3 como eu, tente colá-lo em seu info.plist como filho direto da sua tag de nível superior

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

Você pode encontrar mais informações em:

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


2
Deus te abençoe, mano
Vervatovskis

5

Encontrei solução a partir daqui. E está funcionando para mim.

Verifique isso, pode ajudá-lo.

<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

Basta adicionar os seguintes campos no seu arquivo .plist

insira a descrição da imagem aqui

A sintaxe fica assim:

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

Isso permitirá todas as solicitações http. Funciona, mas não é recomendado.
KVISH 11/0316

2

Atualizar:

A partir do Xcode 7.1, você não precisa inserir manualmente o NSAppTransportSecurityDicionário no info.plist.

Agora ele será preenchido automaticamente, você perceberá que é um dicionário e, em seguida, o preenchimento automático Allows Arbitrarytambém. captura de tela info.plist


Isso permitirá todas as solicitações http. Funciona, mas não é recomendado.
KVISH 11/03

2

Resolva o erro de falha no carregamento HTTP do NSURLConnection Basta adicionar o seguinte comando no info.plist:

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

1

Eu o resolvi adicionando algumas chaves no info.plist. Os passos que segui são:

Abri o arquivo info.plist do meu projeto

Adicionada uma chave chamada NSAppTransportSecurity como um dicionário.

Adicionada uma subchave chamada NSAllowsArbitraryLoads como booleana e defina seu valor como YES como na imagem a seguir. insira a descrição da imagem aqui

Limpe o projeto e agora tudo está funcionando bem como antes.

Link de referência: https://stackoverflow.com/a/32609970


1

Isto é o que funcionou para mim quando tive este erro:

<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

Você pode tentar adicionar esta função no arquivo RCTHTTPRequestHandler.m

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


1

Além das respostas acima mencionadas, verifique novamente o seu URL


No meu caso, eu estava tentando carregar o arquivo .html.
Vaishnavi

0

Você deve adicionar App Transport Security Settingsa info.pliste adicione Allow Arbitrary LoadsaApp Transport Security Settings

insira a descrição da imagem aqui

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.