La sicurezza del trasporto ha bloccato un HTTP in chiaro


1451

Quale impostazione devo inserire in my info.plistper abilitare la modalità HTTP secondo il seguente messaggio di errore?

La sicurezza del trasporto ha bloccato un carico di risorse HTTP (http: //) in chiaro poiché non è sicuro. Eccezioni temporanee possono essere configurate tramite il file Info.plist della tua app.

Xcode

Supponiamo che il mio dominio sia example.com.



15
Nota del moderatore : ci sono già 36 risposte a questa domanda. Prima di aggiungerne un altro , assicurati che la tua soluzione sia nuova .
Matt,

5
NOTA: le soluzioni qui suggeriscono di disattivare ATS ( Allow arbitary loads). Presto questo non sarà possibile poiché Apple richiederà ATS (in origine la fine dell'anno - la scadenza è stata prorogata) - developer.apple.com/news/?id=12212016b
Jakub Truhlář


@Jeef perché hai aggiunto il tag iOS 10? ci sono state ulteriori modifiche in iOS 10 in quella materia? Sento che è stato introdotto in iOS9 e che il tag dovrebbe essere sufficiente in termini di versioni iOS
Julian Król,

Risposte:


469

Se stai usando Xcode 8.0+ e Swift 2.2+ o anche l'obiettivo C:

Inserisci qui la descrizione dell'immagine

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

29
Perché è NSAllowsArbitraryLoadsimpostato su true? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
jww

6
@jww Questo è lo scopo di questo post. Il sito a cui devo collegarmi per riprodurre l'audio non utilizza ancora HTTPS e non sto cercando di aspettare.
ThinkDigital,

5
Questo non funzionerà in iOS 10.0+ o MacOS 10.12+ In realtà dice di consentire tutti i carichi arbitrari TRANNE quelli menzionati (esempio.com). Quindi farebbe il contrario di ciò che si desidera. NSAllowsArbirtraryLoads dovrebbe essere impostato su false qui. maggiori informazioni: Apple docs
Freek Sanders

1
D'accordo, perché mai tutti lo votano? non ha senso usare NSAllowsArbitraryLoads se si imposta un dominio di eccezione.
thibaut noah,

1
NSAllowsArbitraryLoads non deve necessariamente essere vero, quindi deve essere rimosso. NSExceptionDomains è sufficiente per abilitare solo connessioni non sicure a quel dominio. NSAllowsArbitraryLoads = true abiliterà la connessione non protetta a qualsiasi dominio, quindi se l'impostazione su true rende l'assurdità di NSExceptionDomains in quanto include già tutti i domini
mister_giga

950

Usa NSAppTransportSecurity:

Inserisci qui la descrizione dell'immagine

Devi impostare la chiave NSAllowsArbitraryLoads su YES nel dizionario NSAppTransportSecurity nel tuo file info.plist.

Configurazione del plist


157
Fallo sapere: QUESTO È UN LAVORO! Ogni volta che si utilizza HTTP su HTTPS, si stanno aprendo vulnerabilità ai dispositivi dell'utente. Certo è improbabile in molti casi, ma la programmazione etica è la migliore pratica. Dico solo ... - Inoltre, +1 per il lavoro (a scopo di test)
Jacksonkr,

36
Questa NON è una soluzione - questo è un HACK! Per aggiungere singoli dominio "eccezioni" questa risposta qui sotto: stackoverflow.com/a/32560433/1103584
DiscDev

17
Sebbene questa soluzione sia nota per essere vulnerabile, è l' unica soluzione che consiglierei durante lo SVILUPPO . Dover digitare ogni dominio esatto durante lo sviluppo è semplicemente stupido (specialmente se si utilizzano servizi Web di terze parti).
ReTs

6
Il nome di tali chiavi è stato modificato ora in "Impostazioni di sicurezza del trasporto app" sotto "Consenti carichi arbitrari"
vishal dharankar,

11
Perché così tante persone sono contrarie a questa soluzione? Questo sicuramente NON è un trucco! Molte app devono comunicare con Internet reale dove il protocollo di sicurezza non è sempre sotto il tuo controllo. Ad esempio, sembra molto ragionevole essere in grado di mostrare immagini da altri server che non hanno un certificato SSL.
Oren,

825

Ecco le impostazioni visivamente:

impostazioni visive per NSAllowsArbitraryLoads in info.plist tramite Xcode GUI


10
Non ho questa opzione.
Utente

25
Se apri il tuo Info.plist direttamente puoi semplicemente aggiungere il dizionario NSAppTransportSecurity e quindi creare l' elemento NSAllowsArbitraryLoads al suo interno (vedi la risposta modificata da Umar Farooq, di seguito).
Stoph

3
Lo stesso qui - i domini di eccezione non hanno funzionato con 7.3 per me.
Espressione regolare

4
Questa opzione non esiste - XCode 7.3.1
jameshfisher il

3
Le informazioni di @JoshPinter hanno funzionato per me con XCode 8.
Matthew Bellantoni,

717

Vedi il post sul forum Application Transport Security? .

Anche la pagina Configurazione delle eccezioni di sicurezza del trasporto app in iOS 9 e OSX 10.11 .

Ad esempio, puoi aggiungere un dominio specifico come:

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

L'opzione pigra è:

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

Nota:

info.plist è un file XML in modo da poter posizionare questo codice più o meno ovunque all'interno del file.


1
Come posso farlo, intendo qual è il modo di aggiungere questo codice a Info.plist perché non so dove incollare questo codice?
lmiguelvargasf,

2
@lmiguelvargasf apri il tuo info.plist in un editor di testo semplice
Dan Beaulieu

7
Ricevo ancora l'errore: il dominio di eccezione è impostato e NSAllowsArbitraryLoads è falso. Anche con NSAllowsArbitraryLoads impostato su true viene visualizzato l'errore. Qualcun altro qui ha questo problema?
klaevv,

3
A partire dal 30/01/2016, Apple Doc mostra che le chiavi non contengono più la parola temporanea, ad esempio: NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion Vedi developer.apple.com/library/prerelease/ios/documentation/…
Philippe Monnet

3
Nel caso in cui qualcun altro si stia togliendo i capelli perché facendo queste semplici modifiche a info.plist non funziona .. aggiungi le modifiche a Progetto> Target> Informazioni> Proprietà target iOS personalizzate
BlueGuy

330

Questo è stato testato e funzionava su seed GM iOS 9: questa è la configurazione che consente a un dominio specifico di utilizzare HTTP anziché HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoadsdeve essere falseperché non consente tutte le connessioni non sicure, ma l'elenco delle eccezioni consente la connessione ad alcuni domini senza HTTPS.


7
QUESTO dovrebbe essere contrassegnato come risposta. Testato e funzionante su seed iOS 9 GM per consentire a un dominio specifico di utilizzare http senza prendere il metodo "pigro" e aprire completamente la tua app.
DiscDev

2
Come aggiungo questo al mio info.plist?
JMStudios.jrichardson,

8
Ok, ho aggiunto quella voce al mio info.plist e sto ancora ricevendo questo errore: "App Transport Security ha bloccato un carico di risorse HTTP (http: //) in chiaro poiché non è sicuro. Eccezioni temporanee possono essere configurate tramite le informazioni della tua app .plist file ".
KMC,

2
@RomanShapovalov se è necessario utilizzare un indirizzo IP, provare ad aggiungere .xip.io alla fine dell'indirizzo IP e aggiungere xip.io a NSExceptionDomains. Vedere xip.io . Mi connetto direttamente all'IP durante lo sviluppo (ma non rilascio) e questo funziona alla grande per me.
domenica

2
Non funzionava per me fino a quando non mi sono reso conto di averlo inserito nella Info.plist sbagliata nel mio progetto di test. Assicurati di metterlo nel giusto!
Chucky,

144

Questa è una soluzione rapida (ma non consigliata) per aggiungere questo nel plist:

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

Il che significa (secondo la documentazione di Apple ):

NSAllowsArbitraryLoads
Un valore booleano utilizzato per disabilitare la sicurezza del trasporto app per tutti i domini non elencati nel dizionario NSExceptionDomains. I domini elencati utilizzano le impostazioni specificate per quel dominio.

Il valore predefinito NO richiede il comportamento predefinito Sicurezza trasporto app per tutte le connessioni.

Consiglio vivamente i collegamenti:

che mi aiuta a capire le ragioni e tutte le implicazioni.

L'XML (nel file Info.plist) di seguito:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

non consentire chiamate arbitrarie per tutte le pagine, ma per PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDEconsentirà che le connessioni utilizzino il protocollo HTTP.

All'XML sopra puoi aggiungere:

<key>NSIncludesSubdomains</key>
<true/>

se si desidera consentire connessioni non sicure per i sottodomini dell'indirizzo specificato.

L'approccio migliore è bloccare tutti i carichi arbitrari (impostato su false) e aggiungere eccezioni per consentire solo gli indirizzi che sappiamo siano a posto.

Per i lettori interessati

Aggiornamento 2018:

Apple non consiglia di disattivarlo: ulteriori informazioni sono disponibili nella sessione WWDC 2018 207 con ulteriori spiegazioni in merito alla sicurezza

Lasciare la risposta originale per ragioni storiche e fase di sviluppo


1
NSAllowsArbitraryLoadsdeve esserefalse
Sound Blaster il

@SoundBlaster per quale caso e cosa vedi di sbagliato nella mia risposta al voto contrario?
Julian Król,

aggiungendo in plist (NSAppTransportSecurity NSAllowsArbitraryLoads), tutti i servizi Web funzionano correttamente tranne un servizio Web e un errore del server interno restituiscono il servizio Web (500) in iOS 9 ma funzionano correttamente in iOS8 o versioni successive
gupta

@SoundBlaster ha apportato una modifica, ora non dovresti avere obiezioni :)
Julian Król,

Grazie, come si aggiunge effettivamente <key>NSIncludesSubdomains</key> <true/>? Ogni ambiente deve essere circondato <dict>? come si modifica questo dannato file plist? Qual è la formattazione? : D Grazie.
Agente Zebra,

116

Per quelli di voi che desiderano un contesto più ampio sul perché ciò accada, oltre a come risolverlo, leggete di seguito.

Con l'introduzione di iOS 9, per migliorare la sicurezza delle connessioni tra un'app e i servizi Web, le connessioni protette tra un'app e il suo servizio Web devono seguire le migliori pratiche . Il comportamento delle migliori pratiche viene applicato da App Transport Security per:

  • prevenire la divulgazione accidentale e
  • fornire un comportamento predefinito sicuro.

Come spiegato nel Technote di sicurezza del trasporto di app , quando si comunica con il proprio servizio Web, App Transport Security presenta ora i seguenti requisiti e comportamenti:

  • Il server deve supportare almeno il protocollo TLS (Transport Layer Security) versione 1.2.
  • I codici di connessione sono limitati a quelli che forniscono segretezza diretta (vedere l'elenco di codici qui sotto).
  • I certificati devono essere firmati utilizzando un algoritmo di hash SHA256 o migliore della firma, con una chiave RSA a 2048 bit o superiore o una chiave a curva ellittica (ECC) a 256 bit o superiore.
  • I certificati non validi provocano un errore grave e nessuna connessione.

In altre parole, la richiesta del servizio Web deve: a.) Utilizzare HTTPS e b.) Essere crittografata mediante TLS v1.2 con segretezza diretta.

Tuttavia, come menzionato in altri post, è possibile ignorare questo nuovo comportamento da App Transport Security specificando il dominio non sicuro nella Info.plistpropria app.


Per sovrascrivere, dovrai aggiungere le NSAppTransportSecurity> NSExceptionDomainsproprietà del dizionario al tuo Info.plist. Successivamente, aggiungerai il dominio del tuo servizio web al NSExceptionDomainsdizionario.

Ad esempio, se desidero ignorare il comportamento della sicurezza del trasporto app per un servizio Web sull'host www.yourwebservicehost.com , farei quanto segue:

  1. Apri la tua app in Xcode.

  2. Trova il Info.plistfile in Project Navigator e fai clic con il tasto destro del mouse su di esso e scegli l' opzione di menu Apri come > Codice sorgente . Il file dell'elenco delle proprietà verrà visualizzato nel riquadro destro.

  3. Inserisci il seguente blocco di proprietà all'interno del dizionario delle proprietà principale (sotto il primo <dict>).


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Se è necessario fornire eccezioni per domini aggiuntivi, aggiungerebbe un'altra proprietà del dizionario di seguito NSExceptionDomains.

Per saperne di più sui tasti citati sopra, leggi questo technote già menzionato .


1
Questo ha funzionato in 2 delle mie app, ma non funziona su una terza. Qualcun altro ha riscontrato una situazione in cui si utilizzava la correzione precedente e si continuava a ricevere lo stesso messaggio di errore? (e sì, ho aggiornato il dizionario per utilizzare il mio dominio API, non quello nel codice)
ciaoB

I migliori! Apple conferma che questa soluzione utilizza
YannSteph il

Questo ha funzionato per un file di modifica di app Cordova / Phonegap / Ionic ./platforms/ios/<project>/<project>-Info.plistcon NSAllowsArbitraryLoads=falsemolti domini di eccezione per servizi con diverse combinazioni TLS / HTTP / HTTPS. Inizialmente utilizzato, NSAllowsArbitraryLoads=truequindi modificato, risolvendo le regole attraverso tentativi ed errori per conformarsi alle linee guida e inviare per l'approvazione. Le note note config.xml <access origin=.../>popolano parzialmente questo file, ma al momento richiedono una regolazione mediante modifica diretta o tramite XCode per ottenere i dettagli corretti.
Jimmont,

Anche <access origin="*"/>(in config.xml) imposta NSAllowsArbitraryLoads=true(per app Cordova / Phonegap / ibride
jimmont

Perché è NSExceptionAllowsInsecureHTTPLoadsimpostato su true? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
jww

67

Non mi piace modificare direttamente il plist. Puoi facilmente aggiungerlo al plist usando la GUI:

  • Fai clic su Info.plist nel Navigator a sinistra.
  • Ora cambia i dati nell'area principale:

    • Nell'ultima riga aggiungi il +
    • Immettere il nome del gruppo: Impostazioni sicurezza trasporto app
    • Fare clic con il tasto destro sul gruppo e selezionare Add Row
    • Immettere Consenti carichi arbitrari
    • Impostare il valore a destra su

Esempio


Per chiarire: se "Consenti carichi arbitrari" è SÌ e esistono "Domini di eccezione", i carichi consentiti sono limitati a quelli nei Domini di eccezione. È corretto?

è un modo sicuro per farlo se voglio rilasciare l'applicazione?
Lamour,

No. Consentendo carichi arbitrari, la tua app può connettersi liberamente a qualsiasi dominio. Dal punto di vista della sicurezza, è necessario controllare e limitare a quale dominio / sito Web deve connettersi l'app, per evitare un utilizzo imprevisto della rete.
Raptor

La maggior parte delle app si dirige solo verso server noti. Questo è controllato dallo sviluppatore. Quindi i problemi di sicurezza sono noti.
Vincent,

Perché è NSAllowsArbitraryLoadsimpostato su YES? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
JWW

25

Documento Apple 1

Documento Apple 2

Esistono due soluzioni per questo:

Soluzioni 1:

  1. Nel Info.plistfile aggiungi un dizionario con chiave ' NSAppTransportSecurity'
  2. Aggiungi un altro elemento all'interno del dizionario con chiave 'Allow Arbitrary Loads'

Plist la struttura dovrebbe apparire come mostrato nell'immagine seguente.

Soluzione 1

Soluzione 2:

  1. Nel Info.plistfile aggiungi un dizionario con chiave ' NSAppTransportSecurity'
  2. Aggiungi un altro elemento nel dizionario con la chiave ' NSExceptionDomains'
  3. Aggiungi elemento con chiave 'MyDomainName.com'di tipo NSDictionary
  4. Aggiungi elemento con chiave ' NSIncludesSubdomains' di tipo Booleane valore impostato comeYES
  5. Aggiungi elemento con chiave ' NSTemporaryExceptionAllowsInsecureHTTPLoads' di tipo Booleane valore impostato comeYES

Plist la struttura dovrebbe apparire come mostrato nell'immagine seguente.

Soluzione 2

La soluzione 2 è preferita poiché consente solo il dominio selezionato, mentre la soluzione 1 consente tutte le connessioni HTTP non sicure.


Perché è NSAllowsArbitraryLoadsimpostato su YES? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
jww

20

La sicurezza del trasporto è disponibile su iOS 9.0 o versioni successive. È possibile che venga visualizzato questo avviso quando si tenta di chiamare un WS all'interno dell'applicazione:

Application Transport Security ha bloccato un carico di risorse HTTP (http: //) in chiaro poiché non è sicuro. Eccezioni temporanee possono essere configurate tramite il file Info.plist della tua app.

L'aggiunta di quanto segue a Info.plist disattiverà ATS:

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

1
NSAllowsArbitraryLoads deve essere falso, se vero consente tutte le connessioni non
sicure

aggiungendo in plist tutti i servizi Web che funzionano correttamente tranne un servizio Web, un errore del server interno restituisce un servizio Web (500) in iOS 9 ma funziona correttamente in iOS8 o versioni successive
gupta,

1
Accettato nel negozio?
Vrashabh Irde,

Pessimo consiglio; vedi Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Data la domanda se è pieno del modo raccomandato di fare le cose, "anche io" non sono necessarie risposte come questa.
jww

15

Esempio di sviluppo

Ecco uno screenshot di un plist che mantiene intatto ATS (= sicuro), ma consente che le connessioni a localhost possano essere effettuate tramite HTTP anziché HTTPS . Funziona in Xcode 7.1.1.

Inserisci qui la descrizione dell'immagine


Esistono modi per rendere sicuro localhost, ovvero l'utilizzo di HTTPS, in reattivo-nativo in modo da non dover utilizzare la NSExceptionAllowsInsecureHTTPLoads - YESconfigurazione predefinita ?
milkersarac,

13

Vai al tuo Info.plist

  1. Fare clic destro su spazio vuoto e fare clic su Aggiungi riga
  2. Scrivi il nome chiave come NSAppTransportSecurity, sotto di esso
  3. Seleziona Domini di eccezione, aggiungi un nuovo elemento a questo
  4. Scrivi il tuo nome di dominio a cui devi accedere
  5. Cambia il tipo di dominio da stringa a dizionario, aggiungi un nuovo elemento
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads, che sarà un valore booleano con un valore vero. Guarda l'immagine per seguirla correttamente

1
Perché è NSAllowsArbitraryLoadsimpostato su true? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
jww

13

Secondo Apple, in genere la disabilitazione di ATS comporterà il rifiuto delle app, a meno che tu non abbia una buona ragione per farlo. Anche in questo caso, è necessario aggiungere eccezioni per i domini ai quali è possibile accedere in modo sicuro.

Apple ha uno strumento eccellente che ti dice esattamente quali impostazioni usare: in Terminale, inserisci

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

e nscurl verificherà se questa richiesta ha esito negativo, quindi tenterà una varietà di impostazioni e ti dirà esattamente quale passa e cosa fare. Ad esempio, per alcuni URL di terze parti che visito, questo comando mi ha detto che questo dizionario passa:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

Per distinguere tra i tuoi siti e quelli di terze parti che sono fuori dal tuo controllo, usa, ad esempio, la chiave NSThirdPartyExceptionRequiresForwardSecrecy.


1
è un ottimo strumento da verificare prima di testarlo effettivamente con l'applicazione. risparmia tempo. ma qualsiasi risorsa da leggere per comprendere l'output di questo comando.
dannazione,

1
Strumento interessante. Nel mio caso però sopravvaluta le cose. Elenca tre chiavi incluse NSExceptionAllowsInsecureHTTPLoads = true;, ma risulta che una non è necessaria.
Chris Prince,

11

Capire quali impostazioni usare possono essere eseguite automaticamente, come menzionato in questo technote :

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com

A quanto pare, hai bisogno di OS X 10.11 (El Capitan) per questo.
ecotax

10

NOTA: il dominio dell'eccezione nel plist dovrebbe essere in LOWER-CASE.

Esempio: hai chiamato la tua macchina "MyAwesomeMacbook" in Impostazioni-> Condivisione; il tuo server (a scopo di test) è in esecuzione su MyAwesomeMacbook.local: 3000 e la tua app deve inviare una richiesta a http: //MyAwesomeMacbook.local: 3000 / files ..., devi specificare "myawesomemacbook. local "come dominio di eccezione.

-

La tua info.plist conterrebbe ...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

9

Uso:

PList Screenshot per capire meglio

Aggiungi un nuovo elemento, NSAppTransportSecurity , nel file plist con il tipo Dizionario , quindi aggiungi l'elemento secondario NSAllowsArbitraryCarica nel dizionario di tipo Booleano e imposta il valore booleano . Questo funziona per me.


1
NSAllowsArbitraryLoads deve essere falso, se vero consente tutte le connessioni non
sicure

aggiungendo in plist tutti i servizi Web che funzionano correttamente tranne un servizio Web, un errore di server interno restituisce un servizio Web (500) in iOS 9 ma funziona correttamente in iOS8 o versioni successive @ThiagoArreguy
gupta

Pessimo consiglio; vedi Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Data la domanda se è pieno del modo raccomandato di fare le cose, "anche io" non sono necessarie risposte come questa.
jww

So che è un cattivo consiglio, ma è solo una soluzione per ora solo in modalità di sviluppo. Apple ci ha fornito flessibilità, se è così male, non lo permetterebbero.
Tejinder,

9

25/09/2015 (dopo gli aggiornamenti di Xcode sul 18/09/2015):

Ho usato un metodo non pigro, ma non ha funzionato. I seguenti sono i miei tentativi.

Primo,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

E secondo,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Infine, ho usato il metodo pigro:

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

Potrebbe essere un po 'insicuro, ma non sono riuscito a trovare altre soluzioni.


Perché è NSAllowsArbitraryLoadsimpostato su true? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
jww

9

In swift 4 e xocde 10 è necessario modificare NSAllowsArbitraryLoads per consentire carichi arbitrari. quindi sarà simile a questo:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>

6

Vale la pena ricordare come arrivarci ...

Info.plist è uno dei file sotto Main.storyboard o viewController.swift.

Quando fai clic su di esso per la prima volta, di solito è in un formato tabella, quindi fai clic con il pulsante destro del mouse sul file e 'apri come' Codice sorgente, quindi aggiungi il codice in basso verso la fine, ovvero:

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

Copia incolla il codice appena sopra

 "</dict>
</plist>"

che è alla fine.


Perché è NSAllowsArbitraryLoadsimpostato su true? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
JWW

5

Aggiornamento per Xcode 7.1, affrontando il problema 27.10.15:

Il nuovo valore in Info.plist è "Impostazioni di sicurezza del trasporto app". Da lì, questo dizionario dovrebbe contenere:

  • Consenti carichi arbitrari = SÌ
  • Domini di eccezione (inserisci qui il tuo dominio http)

4

Per coloro che sono venuti qui cercando di trovare il motivo per cui il loro WKWebView è sempre bianco e non carica nulla (esattamente come descritto qui come faccio a far funzionare WKWebView in modo rapido e per un'app macOS ):

Se tutta la scienza missilistica di cui sopra non funziona per te, controlla l'ovvio: le impostazioni sandbox

impostazioni sandbox]

Essendo nuovo per il rapido e il cacao, ma piuttosto esperto nella programmazione, ho impiegato circa 20 ore per trovare questa soluzione. Nessuna dozzina di tutorial iOS per hipster o note chiave di Apple: nulla menziona questa piccola casella di controllo.


Oh mio Dio, grazie mille! Mi hai salvato la stessa ricerca di 20 ore!
Brecht Machiels,

2
non vedere quella sezione nella sezione Funzionalità del target (Xcode 9.4.1)
shim

3

Per impostazione predefinita, iOS consente solo l'API HTTPS. Poiché HTTP non è sicuro, dovrai disabilitare la sicurezza del trasporto delle app. Esistono due modi per disabilitare ATS: -

1. Aggiunta del codice sorgente nel progetto info.plist e aggiunta del codice seguente nel tag root.

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

2. Utilizzo delle informazioni sul progetto.

Fare clic sul progetto nel progetto a sinistra, selezionare il progetto come destinazione e selezionare la scheda Informazioni. Devi aggiungere il dizionario nella seguente struttura.

inserisci qui la descrizione dell'immagine



1

L'uso NSExceptionDomainspotrebbe non applicare un effetto simultaneamente a causa del sito di destinazione può caricare risorse (ad es. jsFile) da domini esterni http. Può essere risolto aggiungendo anche questi domini esterni NSExceptionDomains.

Per verificare quali risorse non possono essere caricate, provare a utilizzare il debug remoto. Ecco un tutorial: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/


0

Per Cordova, se si desidera aggiungerlo nel proprio ios.json, procedere come segue:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

E dovrebbe essere all'interno di:

"*-Info.plist": {
   "parents": {
   }
}

Solo <access origin = "*" /> in config.xml non ha funzionato. Non sono sicuro che entrambi siano necessari, ma la soluzione ios.json ha sigillato l'affare per me.
zeusstl

Perché è NSAllowsArbitraryLoadsimpostato su true? Sovverti lo scopo di ATS. Vedi anche Il codice più pericoloso al mondo: convalida dei certificati SSL in software non browser . Il tuo software ha appena fatto la lista.
jww

-1

Come molti hanno notato, questo è un problema di funzionalità fornito con iOS 9.0. Hanno aggiunto una cosa chiamata App Transport Security, e anche io ero infastidito quando ha rotto le mie app.

Puoi fasciarlo con la chiave NSAllowsArbitraryLoads su YES nel dizionario NSAppTransportSecurity nel tuo file .plist, ma alla fine dovrai riscrivere il codice che forma i tuoi URL per formare il prefisso HTTPS: //.

Apple ha riscritto la classe NSUrlConnection in iOS 9.0. Puoi leggerlo in NSURLConnection .

Altrimenti, potrebbe essere necessario uscire da iOS 9.0 fino a quando non si ha il tempo di implementare la soluzione corretta.

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.