Impossibile caricare la risorsa poiché la politica di sicurezza del trasporto app richiede l'uso di una connessione protetta


492

Sto affrontando il problema quando ho aggiornato il mio Xcode a 7.0 o iOS 9.0. In qualche modo ha iniziato a darmi l'errore intitolato

"Impossibile caricare la risorsa perché la politica di sicurezza del trasporto app richiede l'uso di una connessione protetta"

Metodo di servizio web:

-(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];

}

Il servizio funziona correttamente per le versioni precedenti di Xcode e le versioni precedenti di iOS Ma quando ho aggiornato Xcode 7.0 su iOS 9.0, ha iniziato a darmi il problema come segue quando chiamo il metodo di servizio Web sopra riportato. L'errore registrato che sto ottenendo è:

Connessione non riuscita: errore Dominio = Codice NSURLErrorDomain = -1022 "Impossibile caricare la risorsa perché la politica di sicurezza del trasporto app richiede l'uso di una connessione protetta." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , la politica non può essere utilizzata per la sicurezza. connessione.}

Ho provato a seguire le domande e le risposte ma non ho ottenuto alcun risultato lì, c'è qualche idea anticipata su come posso rimuovere l'errore di chiamata di servizio?

  1. La risorsa non può essere caricata è iOS9
  2. App Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

Risposte:


936

L'ho risolto aggiungendo una chiave in info.plist. I passaggi che ho seguito sono:

  1. Ho aperto il info.plistfile del mio obiettivo di progetto

  2. Aggiunta una chiave chiamata NSAppTransportSecuritycome Dictionary.

  3. Aggiunta una sottochiave chiamata NSAllowsArbitraryLoadsas Booleane imposta il suo valore YEScome come nell'immagine seguente.

inserisci qui la descrizione dell'immagine

Pulisci il progetto e ora tutto funziona come prima.

Link di riferimento: https://stackoverflow.com/a/32609970

EDIT: OR Nel codice sorgente del info.plistfile possiamo aggiungere che:

<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
All'inizio non funziona. Devi aggiungere le chiavi all'interno di Progetto> Target troppo
orafaelreis


1
@MihirOza: Sì, la sicurezza dei trasporti è una nuova funzionalità di iOS 9.
Dominic K

2
Se non hai domini di eccezione, rimuovi qualsiasi chiave in NSExceptionDomains. Altrimenti sarà un'eccezione NSAllowArbitraryLoads, quindi è necessario utilizzare https per visitare questoexception
DawnSong

7
Per Xcode 8.3 / Swift 3 è App Transport Security Settingse Allow Arbitrary Loadsrispettivamente
Swapna Lekshmanan il

280

Attenzione, l'utilizzo NSAllowsArbitraryLoads = truenel progetto info.plistconsente di rendere insicure tutte le connessioni a qualsiasi server. Se vuoi assicurarti che solo un dominio specifico sia accessibile attraverso una connessione non sicura , prova questo:

inserisci qui la descrizione dell'immagine

Oppure, come codice sorgente:

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

Pulisci e costruisci progetto dopo la modifica.


grazie per la tua risposta solo NSAllowArbitaryLoads non ha funzionato per me aggiungendo NSExceptionAllowsInsecureHTTPLoads ha fatto il trucco
neeta

1
Ho anche aggiunto queste due chiavi: <! - Includi per consentire richieste HTTP -> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - Includi per specificare la versione TLS minima -> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </string> Ha anche reso MOLTO più veloce.
Sandy D.

Nota: sto usando XCode 8 ora: se lo stai facendo manualmente, assicurati di fare clic destro sul dominio> Tipo valore> Dizionario per aggiungere "..AllowsInsecure ..." e "... IncludesSubdomains"
ArielSD

Non funziona se si specifica il numero di porta dopo domain.com. (domain.com:3001 per esempio)
Shamsiddin,

43

La sicurezza del trasporto è disponibile in iOS 9.0 o versioni successive e in OS X v10.11 e versioni successive.

Quindi, per impostazione predefinita, solo le chiamate https sono consentite solo nelle app. Per disattivare App Transport Security aggiungi le seguenti righe nel file info.plist ...

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

Per maggiori informazioni:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


Ma ciò non mi consente ancora di effettuare chiamate HTTP a nessun dominio. C'è qualche indizio sul perché sta accadendo?
Mrug

Anche se è un URL HTTP, lo shoulb dell'URL deve essere verificato o dovrebbe avere un certificato SSL vlid.
Teja Kumar Bethina,

35

Per iOS 10.xe Swift 3.x [sono supportate anche le versioni seguenti] basta aggiungere le seguenti righe in 'info.plist'

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

1
Per 10.xe Swift 3.x, avevo visto altrove che le chiavi erano in realtà AppTransportSecurity e AllowsArbitraryLoads ma quelle erano sbagliate. il prefisso NS è ancora necessario per questi tasti, anche per Swift 3.x. L'errore è scomparso quando ho fatto affidamento sul prefisso NS per queste chiavi.
Jazzmine,

27

In Swift 4 È possibile utilizzare

-> Vai a Info.plist

-> Fare clic su più dell'elenco Proprietà informazioni

-> Aggiungi impostazioni di sicurezza del trasporto app come dizionario

-> Fare clic sull'icona Plus Impostazioni sicurezza trasporto app

-> Aggiungi Consenti carichi arbitrari impostato

L'immagine qui sotto sembra

inserisci qui la descrizione dell'immagine


23

Ho risolto come file plist.

Aggiungi un NSAppTransportSecurity: Dizionario.

Aggiungi la sottochiave denominata "NSAllowsArbitraryLoads" come booleana: SÌ

inserisci qui la descrizione dell'immagine


18

Non è stato possibile caricare la risorsa perché la politica di sicurezza del trasporto app richiede l'uso di una connessione sicura che funziona in Swift 4.03.

Apri pList.info come codice sorgente e incolla:

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

13

Dalla documentazione Apple

Se stai sviluppando una nuova app, dovresti utilizzare esclusivamente HTTPS. Se disponi di un'app esistente, dovresti utilizzare HTTPS il più possibile in questo momento e creare un piano per la migrazione del resto dell'app nel più breve tempo possibile. Inoltre, la comunicazione attraverso API di livello superiore deve essere crittografata utilizzando TLS versione 1.2 con segretezza diretta. Se si tenta di stabilire una connessione che non soddisfa questo requisito, viene generato un errore. Se l'app deve presentare una richiesta a un dominio non sicuro, è necessario specificare questo dominio nel file Info.plist dell'app.

Per bypassare la sicurezza del trasporto delle app:

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

Per consentire tutti i domini non sicuri

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

Ulteriori informazioni: Configurazione delle eccezioni di sicurezza del trasporto app in iOS 9 e OSX 10.11



9

Da Xcode 7.1 in poi (swift 2.0)

inserisci qui la descrizione dell'immagine


9

Questo è il modo di Apple di forzare una maggiore sicurezza sulle tue API (costretto a usare https su http). Spiegherò come rimuovere questa impostazione di sicurezza.


La maggior parte delle risposte qui sottolinea l'aggiunta di questa chiave al tuo info.plist inserisci qui la descrizione dell'immagine

Questo da solo non ha risolto questo problema per me. Ho dovuto aggiungere la stessa chiave all'interno

Project -> Targets -> Info -> Custom iOS Target Properties inserisci qui la descrizione dell'immagine


Ciò consentirà comunque connessioni non sicure da parte di chiunque. Se si desidera consentire solo a un dominio specifico di utilizzare connessioni non sicure, è possibile aggiungere quanto segue al proprio info.plist.

inserisci qui la descrizione dell'immagine


Grazie, ha funzionato per me! Ho modificato solo il file plist prima del quale non ha funzionato. Sono sorpreso di come le altre persone lo abbiano fatto funzionare in quel modo
jones

8

Devi solo usare HTTPS e non HTTP nel tuo URL e funzionerà


3
A meno che, ovviamente, non sia possibile utilizzare HTTPS perché ad Apple non piacciono i certificati autofirmati. Non hai questo problema?
Tony B,

1
Nel mio caso, funziona perfettamente da quando sono passato a HTTPS
pierre23

1
ma usi un certificato autofirmato o firmato dalla CA? Solo curioso. Una specie di problema separato, ovviamente, ma ho pensato che avrei chiesto.
Tony B,

Non ho lavorato sul lato server, non so essere sincero :(
pierre23

L'impostazione della connessione HTTPS su alcuni ambienti server (hosting condiviso) potrebbe essere difficile.
Raptor

7

Se non sei un grande fan di XML, aggiungi semplicemente il tag di seguito nel tuo file plist.

inserisci qui la descrizione dell'immagine


5

iOS 9 (potrebbe) forzare gli sviluppatori a utilizzare esclusivamente App Transport Security . L'ho sentito da qualche parte a caso, quindi non so se questo sia vero da solo. Ma lo sospetto e sono giunto a questa conclusione:

L'app in esecuzione su iOS 9 (forse) non si connetterà più a un server Meteor senza SSL.

Questo significa che eseguire Meteos Run iOS o Mete Run ios-device (probabilmente?) Non funzionerà più.

Nel Info.plist dell'applicazione, NSAppTransportSecurity [Dictionary]ha bisogno di avere una chiave NSAllowsArbitraryLoads [Boolean]per essere impostata YESo Meteor ha bisogno di usare httpsper la sua localhost serverbreve.


5

Se si utilizza Xcode da 8.0 a 8.3.3 e rapidamente da 2.2 a 3.0

Nel mio caso è necessario modificare l'URL http: // in https: // (se non funziona, provare)

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

inserisci qui la descrizione dell'immagine


3

Apri pList.info come codice sorgente e in fondo appena prima di </dict>aggiungere il seguente codice,

 <!--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 infine cambia your.domain.comcon l'URL di base. Grazie.


3

Per quelli di voi che sviluppano su localhost seguire questi passaggi:

  1. Tocca il pulsante "+" accanto Information Property Liste aggiungi App Transport Security Settingse assegnagli un DictionaryTipo
  2. Tocca il pulsante "+" accanto alla App Transport Security Settingsvoce appena creata e aggiungi il NSExceptionAllowsInsecureHTTPLoadstipo Booleane imposta il suo valore su YES.
  3. Fare clic con il tasto destro del mouse sulla NSExceptionAllowsInsecureHTTPLoadsvoce e fare clic sull'opzione "Sposta riga a destra" per renderla figlio della voce precedente.
  4. Tocca il pulsante "+" accanto alla NSExceptionAllowsInsecureHTTPLoadsvoce e aggiungi il Allow Arbitrary Loadstipo Booleane imposta il suo valore suYES

Nota: alla fine dovrebbe apparire come mostrato nella figura seguente

inserisci qui la descrizione dell'immagine


2

Sono riuscito a risolverlo con una combinazione di molte delle opzioni menzionate. Includerò un elenco di controllo di tutte le cose che dovevo fare per farlo funzionare.

In breve:

  1. Impostare NSAllowsArbitraryLoadssu true per l'estensione dell'orologio (non per l'app per l'orologio).
  2. Assicurarsi che stavo usando httpse non http.

Primo passo:

In primo luogo e, ovviamente, ho dovuto aggiungere una NSAppTransportSecuritychiave come dizionario nelle estensioni del mio orologio info.plistcon una sottochiave chiamata NSAllowsArbitraryLoadsbooleana impostata su true. Impostalo solo nell'estensione dell'orologio e non nel plist dell'app dell'orologio. Sebbene si noti che ciò consente tutte le connessioni e potrebbe essere insicuro.

inserisci qui la descrizione dell'immagine

o

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

Passo due:

Quindi ho dovuto assicurarmi che l'URL che stavo cercando di caricare fosse httpse non solo http. Per tutti gli URL che erano ancora http ho usato:

Veloce :

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

Obj-C:

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


2

Assicurati di modificare il file info.plist corretto .

Questa è la seconda volta che perdo questo problema, perché non ho notato che sto cambiando info.plist in MyProjectNameUITests.


1

Se usi firebase, verrà aggiunto NSAllowsArbitraryLoadsInWebContent = truenella NSAppTransportSecuritysezione e NSAllowsArbitraryLoads = truenon funzionerà


Grazie per questa informazione Mi hai risparmiato ore di risoluzione dei problemi.
pAkY88,

0

Ho risolto questo problema nel caso di un parse-server self-hosted utilizzando un certificato firmato un anno anziché l'opzione "NSAllowsArbitraryLoads"

Parse Server come qualsiasi server node.js presenta un URL https pubblico che devi specificare. Per esempio:

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

Sentiti libero di dare un'occhiata ai miei file di configurazione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.