Não foi possível carregar o recurso porque a política de Segurança de Transporte de Aplicativo requer o uso de uma conexão segura


492

Estou enfrentando o problema quando atualizei meu Xcode para 7.0 ou iOS 9.0. De alguma forma, começou a me dar o erro de título

"O recurso não pôde ser carregado porque a política de segurança de transporte de aplicativos requer o uso de uma conexão segura"

Método Webservice:

-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setAllowsCellularAccess:YES];
    [sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
    NSLog(@"URl %@%@",url,DataString);
    // Configure the Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
    request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPMethod = @"Post";

    // post the request and handle response
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                          {
                                              // Handle the Response
                                              if(error)
                                              {
                                                  NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);

                                                  // Update the View
                                                  dispatch_async(dispatch_get_main_queue(), ^{

                                                      // Hide the Loader
                                                      [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES];


                                                  });
                                                  return;
                                              }
                                              NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL];
                                              for (NSHTTPCookie * cookie in cookies)
                                              {
                                                  NSLog(@"%@=%@", cookie.name, cookie.value);
                                                  strSessName=cookie.name;
                                                  strSessVal=cookie.value;

                                              }

                                              NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];
[postDataTask resume];

}

O serviço está funcionando bem para versões anteriores do Xcode e versões anteriores do iOS. Mas, quando atualizei para o Xcode 7.0 no iOS 9.0, ele começou a me dar o problema como a seguir quando eu estou chamando o método de serviço web acima. O erro registrado que estou recebendo é:

Falha na conexão: Erro Domínio = NSURLErrorDomain Code = -1022 "O recurso não pôde ser carregado porque a política de Segurança de Transporte de Aplicativo requer o uso de uma conexão segura." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Erro Domínio = Código kCFErrorDomainCFNetwork = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , NSLocalizedDescription = O recurso não pôde ser carregado porque a política App Transport Security requer o uso de um seguro conexão.}

Tentei as perguntas e respostas a seguir, mas não obtive nenhum resultado, existe alguma ideia prévia de como posso remover esse erro de chamada de serviço?

  1. Não foi possível carregar o recurso é ios9
  2. App Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

Respostas:


935

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

  1. Abri o info.plistarquivo de destino do meu projeto

  2. Adicionada uma chave chamada NSAppTransportSecuritycomo a Dictionary.

  3. Adicionada uma subchave chamada NSAllowsArbitraryLoadsas Booleane defina seu valor YEScomo 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

EDIT: OR No código fonte do info.plistarquivo, podemos adicionar que:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
  </dict>

5
Não é trabalho a princípio. Você precisa adicionar as chaves dentro do Projeto> alvo demasiado
orafaelreis

4
Aqui estão algumas documentações úteis da Apple developer.apple.com/library/ios/documentation/General/Reference/…
LargeGlasses

1
@MihirOza: Sim, a segurança do transporte é um novo recurso do iOS 9.
Dominic K

2
Se você não tiver domínios de exceção, basta remover qualquer chave abaixo NSExceptionDomains. Ou então ele será uma exceção para NSAllowArbitraryLoads, em seguida, você deve usar https para visitar esteexception
DawnSong

7
Para Xcode 8.3 / Swift 3 é App Transport Security Settingse Allow Arbitrary Loadsrespectivamente
Swapna Lekshmanan

280

Esteja ciente de que o uso NSAllowsArbitraryLoads = trueno projeto info.plistpermite que toda a conexão com qualquer servidor seja insegura. Se você deseja garantir que apenas um domínio específico esteja acessível por meio de uma conexão não segura , tente o seguinte:

insira a descrição da imagem aqui

Ou, como código fonte:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>domain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Limpar e criar projeto após a edição.


Obrigado pela sua resposta apenas NSAllowArbitaryLoads não trabalho para mim NSExceptionAllowsInsecureHTTPLoads adicionando fez o truque
Neeta

1
Também adicionei essas duas chaves: <! - Incluir para permitir solicitações HTTP -> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - Incluir para especificar a versão TLS mínima -> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </string> Isso também carregou MUITO mais rápido.
Sandy D.

Nota: Estou usando o XCode 8 agora: se você estiver fazendo isso manualmente, clique com o botão direito do mouse no domínio> Tipo de valor> Dicionário para adicionar "..AllowsInsecure ..." e "...
IncluiSubdomínios

Não funcionará se eu especificar o número da porta após domain.com. (domain.com:3001 por exemplo)
Shamsiddin 19/06/19

43

A segurança de transporte é fornecida no iOS 9.0 ou posterior e no OS X v10.11 e posterior.

Portanto, por padrão, apenas chamadas https são permitidas apenas em aplicativos. Para desativar o App Transport Security, adicione as seguintes linhas no arquivo info.plist ...

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

Para obter mais informações:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


Mas isso ainda não me permite fazer chamadas HTTP para nenhum domínio. Existe alguma pista por que isso está acontecendo?
Mrug

Mesmo sendo um URL HTTP, o URL deve ser verificado ou deve ter um certificado SSL vlid.
Teja Kumar Bethina 6/04

35

Para iOS 10.xe Swift 3.x [as versões abaixo também são suportadas], basta adicionar as seguintes linhas em 'info.plist'

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

1
Para 10.xe Swift 3.x, eu já havia visto em outro lugar que as chaves eram na verdade AppTransportSecurity e AllowsArbitraryLoads, mas estavam erradas. o prefixo NS ainda é necessário para essas chaves, mesmo para o Swift 3.x. O erro desapareceu quando contei com o prefixo NS para essas chaves.
Jazzmine

27

No Swift 4, você pode usar

-> Vá para Info.plist

-> Clique em mais da lista de propriedades de informações

-> Adicionar configurações de segurança de transporte de aplicativos como dicionário

-> ícone Clique em Mais Configurações de segurança de transporte de aplicativos

-> Adicionar Permitir Cargas Arbitrárias definido SIM

Imagem abaixo

insira a descrição da imagem aqui


23

Eu resolvi como arquivo plist.

Adicione um NSAppTransportSecurity: Dictionary.

Adicione a subchave denominada "NSAllowsArbitraryLoads" como booleana: SIM

insira a descrição da imagem aqui


18

Não foi possível carregar o recurso porque a política de Segurança de Transporte de Aplicativo requer o uso de uma conexão segura funcionando no Swift 4.03.

Abra seu pList.info como código-fonte e cole:

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

13

Da documentação da Apple

Se você estiver desenvolvendo um novo aplicativo, use HTTPS exclusivamente. Se você possui um aplicativo existente, 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. Além disso, sua comunicação por meio de APIs de nível superior precisa ser criptografada usando o TLS versão 1.2 com sigilo direto. Se você tentar fazer uma conexão que não siga esse requisito, será gerado um erro. Se o seu aplicativo precisar fazer uma solicitação para um domínio não seguro, você deverá especificar esse domínio no arquivo Info.plist do seu aplicativo.

Para ignorar a segurança de transporte de aplicativos:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.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>

Para permitir todos os domínios não seguros

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Leia mais: Configurando exceções de segurança de transporte de aplicativos no iOS 9 e OSX 10.11



9

No Xcode 7.1 em diante (swift 2.0)

insira a descrição da imagem aqui


9

Essa é a maneira de a Apple forçar uma segurança mais rígida em suas APIs (forçada a usar https sobre http). Vou explicar como remover essa configuração de segurança.


A maioria das respostas aqui apontam para adicionar essa chave ao seu info.plist insira a descrição da imagem aqui

Isso por si só não resolveu esse problema para mim. Eu tive que adicionar a mesma chave para dentro

Project -> Targets -> Info -> Custom iOS Target Properties insira a descrição da imagem aqui


Isso permitirá que conexões inseguras ocorram de qualquer pessoa. Se você deseja permitir que apenas um domínio específico use conexões inseguras, adicione o seguinte ao seu info.plist.

insira a descrição da imagem aqui


Obrigado, isso funcionou para mim! Apenas editei o arquivo plist antes do qual não funcionou. Estou surpreso como as outras pessoas conseguiram trabalhar dessa maneira
jones

8

Você só precisa usar HTTPS e não HTTP no seu URL e ele funcionará


3
A menos, é claro, que você não possa usar HTTPS porque a Apple não gosta de certificados autoassinados. Você não tem esse problema?
Tony B

1
No meu caso, ele funciona perfeitamente desde que eu alterado para HTTPS
pierre23

1
mas você usa um certificado autoassinado ou assinado pela CA? Apenas curioso. É uma questão separada, é claro, mas achei que eu perguntaria.
Tony B

Eu não trabalho no lado do servidor, eu não sei, para ser honesto :(
pierre23

A configuração da conexão HTTPS em alguns ambientes de servidor (hospedagem compartilhada) pode ser difícil.
Raptor

7

Se você não é um grande fã de XML, basta adicionar a tag abaixo no seu arquivo plist.

insira a descrição da imagem aqui


5

O iOS 9 (maio) força os desenvolvedores a usar exclusivamente o App Transport Security . Eu ouvi isso em algum lugar aleatoriamente, então não sei se isso é verdade. Mas eu suspeito e cheguei a esta conclusão:

O aplicativo em execução no iOS 9 (talvez) não se conectará mais a um servidor Meteor sem SSL.

Isso significa que executar o iOS de execução de meteoros ou o dispositivo iOS de execução de meteoros (provavelmente?) Não funcionará mais.

No info.plist do aplicativo, é NSAppTransportSecurity [Dictionary]necessário ter uma chave NSAllowsArbitraryLoads [Boolean]a ser configurada YESou o Meteor precisa ser usado httpsem localhost serverbreve.


5

Se você estiver usando o Xcode 8.0 a 8.3.3 e o swift 2.2 a 3.0

No meu caso, preciso alterar o URL http: // para https: // (se não estiver funcionando, tente)

Add an App Transport Security Setting: Dictionary.
Add a NSAppTransportSecurity: Dictionary.
Add a NSExceptionDomains: Dictionary.
Add a yourdomain.com: Dictionary.  (Ex: stackoverflow.com)

Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES

insira a descrição da imagem aqui


3

Abra seu pList.info como código-fonte e, na parte inferior, pouco antes de </dict>adicionar o seguinte código,

 <!--By Passing-->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.domain.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>
    <!--End Passing-->

E, finalmente, mude your.domain.comcom seu URL base. Obrigado.


3

Para aqueles que estão desenvolvendo no localhost, siga estas etapas:

  1. Toque no botão "+" ao lado de Information Property Liste adicione App Transport Security Settingse atribua um DictionaryTipo
  2. Toque no botão "+" ao lado da App Transport Security Settingsentrada recém-criada e adicione NSExceptionAllowsInsecureHTTPLoadsdo tipo Booleane defina seu valor como YES.
  3. Clique com o botão direito do mouse na NSExceptionAllowsInsecureHTTPLoadsentrada e clique na opção "Shift Row Right" para torná-la filha da entrada acima.
  4. Toque no botão "+" ao lado da NSExceptionAllowsInsecureHTTPLoadsentrada e adicione Allow Arbitrary Loadsdo tipo Booleane defina seu valor comoYES

Nota: No final, deve ser algo como apresentado na figura a seguir

insira a descrição da imagem aqui


2

Consegui resolver isso com uma combinação de muitas das opções mencionadas. Vou incluir uma lista de verificação de todas as coisas que tive que fazer para que isso funcionasse.

Em resumo:

  1. Defina NSAllowsArbitraryLoadscomo true para minha extensão de relógio (não para o meu aplicativo de relógio).
  2. Verifique se eu estava usando httpse não http.

Passo um:

Primeiro e mais obviamente, eu tive que adicionar uma NSAppTransportSecuritychave como dicionário nas extensões do meu relógio info.plistcom uma subchave chamada NSAllowsArbitraryLoadscomo um conjunto booleano como true. Apenas definir esta na extensão relógio e não plist do aplicativo relógio. Embora observe que isso permite todas as conexões e pode ser inseguro.

insira a descrição da imagem aqui

ou

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

Passo dois:

Então eu tive que ter certeza de que o URL que estava tentando carregar era httpse não apenas http. Para qualquer URL que ainda fosse http, usei:

Swift :

let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")

Obj-C:

NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];


2

Certifique-se de alterar o arquivo info.plist correto .

Esta é a segunda vez que perco tempo com esse problema, porque não percebi que estou alterando info.plist em MyProjectNameUITests.


1

Se você usar o firebase, ele será adicionado NSAllowsArbitraryLoadsInWebContent = truena NSAppTransportSecurityseção e NSAllowsArbitraryLoads = truenão funcionará


Obrigado por esta informação. Você me salvou horas de solução de problemas.
pAkY88 5/06

0

Resolvi esse problema no caso de um servidor de análise auto-hospedado usando um certificado assinado de um ano em vez da opção "NSAllowsArbitraryLoads"

O Parse Server como qualquer servidor node.j apresenta uma URL https pública que você precisa especificar. Por exemplo:

parse-server --appId --masterKey --publicServerURL https: //seu.public.url/some_nodejs

Sinta-se livre para dar uma olhada nos meus arquivos de configuração

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.