NSURLSession / NSURLConnection Caricamento HTTP non riuscito su iOS 9


137

Ho provato a eseguire la mia app esistente su iOS9 ma ho riscontrato un errore durante l'utilizzo AFURLSessionManager.

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

    } else {

    }
}];

[task resume];

Ottengo il seguente errore:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Ottenere anche i seguenti registri:

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

Aggiornamento: ho aggiunto più aggiornamenti alla mia soluzione: caricamento HTTP NSURLSession / NSURLConnection non riuscito su iOS 9


Sei sicuro che l'errore si stia verificando nella prima riga?
BSMP,

1
Ho avuto lo stesso problema. Questo sembrava per coprire il problema: stackoverflow.com/questions/30720813/...
phillies2628

Risposte:


240

Soluzione trovata:

In iOS9, ATS applica le migliori pratiche durante le chiamate di rete, incluso l'uso di HTTPS.

Dalla documentazione Apple:

ATS impedisce la divulgazione accidentale, fornisce un comportamento predefinito sicuro ed è facile da adottare. È necessario adottare ATS il prima possibile, indipendentemente dal fatto che si stia creando una nuova app o aggiornando una esistente. 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.

In beta 1, al momento non è possibile definirlo in info.plist. La soluzione è aggiungerlo manualmente:

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

inserisci qui la descrizione dell'immagine

Aggiornamento 1: questa è una soluzione temporanea fino a quando non sei pronto per adottare il supporto ATS iOS9.

Aggiornamento2: per ulteriori dettagli, consultare il seguente link: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Aggiornamento 3: se si sta tentando di connettersi a un host (YOURHOST.COM) che ha solo TLS 1.0

Aggiungi questi alla Info.plist della tua app

<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
Tieni presente che ti sei appena liberato completamente di Application Transport Security, quindi una delle principali funzionalità di iOS 9 è appena scomparsa dalla tua app. Questo è un hack e non sarei sorpreso se quell'hack venisse rifiutato. L'aggiunta di determinati siti Web a questi dizionari sarà probabilmente consentita.
gnasher729,

2
@StevenPeterson Sarai in grado di ottenere un'intera app esclusa caso per caso da Apple. Suppongo che se Apple benedice la tua app con questa capacità, ti insegneranno a includere questa chiave. Aspettati che Apple lo faccia raramente.
Mattyohe,

8
Per favore, per favore, per favore, per favore, per favore - non solo aggiungere l'eccezione al tuo plist e passare "solo perché funziona". Considerare la sicurezza dei dati dell'utente e implementare SSL e altre best practice sulla sicurezza.
Babbo Natale,

8
@ gnasher729, capisco che è meglio supportare TLS 1.2, invece di disabilitare solo ATS. Tuttavia, cosa puoi fare se ti affidi a un'API / servizio web di terze parti. Non posso forzarli ad aggiornare, quindi cosa posso fare ??
Woodstock,

7
C'è un bug sottile in questa risposta: NSTemporaryExceptionMinimumTLSVersiondeve essere ad esempio TLSv1.0 invece di 1.0 , vedi Chiavi del dizionario dei domini di eccezione
NSAppTransportSecurity

54

Come gestire SSL in iOS9 , Una soluzione è fare come:

Come dice la Apple : inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

iOS 9 e OSX 10.11 richiedono TLSv1.2 SSL per tutti gli host da cui prevedi di richiedere dati a meno che non specifichi domini di eccezione nel file Info.plist della tua app.

La sintassi per la configurazione di Info.plist è simile alla seguente:

<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 l'applicazione (un browser Web di terze parti, ad esempio) deve connettersi a host arbitrari, è possibile configurarla in questo modo:

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

Se devi farlo, probabilmente è meglio aggiornare i tuoi server per utilizzare TLSv1.2 e SSL, se non lo stanno già facendo. Questo dovrebbe essere considerato una soluzione temporanea.

Ad oggi, la documentazione pre-release non menziona nessuna di queste opzioni di configurazione in alcun modo specifico. Una volta fatto, aggiornerò la risposta per collegarmi alla documentazione pertinente.

Per maggiori informazioni, vai su iOS9AdaptationTips


4
SSL e TLS sono diversi livelli di crittografia utilizzati dai protocolli HTTPS. Pertanto, si dovrebbe disabilitare completamente SSL e utilizzare TLS v1.2 o successive. Per ulteriori informazioni, consiglierei di iniziare con la seguente risorsa: SSL / TLS Security 2015 - Una guida rapida semplificata
Conrad Taylor,

2
Ho solo aggiunto fortuna con l'esempio in basso in cui hai impostato NSAllowsArbitraryLoads su true. Il mio server utilizza esclusivamente TLS v1.2 e devo ancora farlo per farlo funzionare. Molto frustrante.
Scooter

1
Quindi c'è qualche soluzione alternativa che potrei usare per sapere con certezza che la mia nuova app verrà approvata nell'App Store, come un servizio proxy?
Josh,

41

Technote di Apple sulla sicurezza del trasporto delle app è molto utile ; ci ha aiutato a trovare una soluzione più sicura al nostro problema.

Spero che questo possa aiutare qualcun altro. Abbiamo riscontrato problemi di connessione agli URL Amazon S3 che sembravano perfettamente validi, gli URL HTTPS TLSv12. Si scopre che abbiamo dovuto disabilitare NSExceptionRequiresForwardSecrecyper abilitare un'altra manciata di cifre utilizzate da S3.

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

Questo è stato il mio problema esatto e lo ha risolto all'istante! Grazie! :)
Alex Zak,

Questo risolve anche il problema che ho avuto; tuttavia, casi diversi potrebbero richiedere impostazioni diverse. La buona notizia è che technote contiene anche informazioni su come usare nsurl per aiutarti a trovare le impostazioni corrette in generale.
ecotax,

Se avessi usato un CDN davanti ad Amazon S3, dovevo fare lo stesso per cloudfront.net.
Raymond26,

7

Se riscontri questo problema con Amazon S3 come me, prova a incollarlo sul tuo info.plist come figlio diretto del tuo tag di livello superiore

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

Puoi trovare maggiori informazioni su:

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


2
Dio ti benedica fratello
Vervatovskis,

5

Ho trovato una soluzione da qui. E funziona per me.

Controlla questo, potrebbe aiutarti.

<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

Aggiungi semplicemente i seguenti campi nel tuo file .plist

inserisci qui la descrizione dell'immagine

La sintassi è simile alla seguente:

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

Ciò consentirà tutte le richieste http. Funziona, ma non raccomandato.
KVISH,

2

Aggiornare:

A partire da Xcode 7.1, non è necessario inserire manualmente il NSAppTransportSecurityDizionario in info.plist.

Ora completerà automaticamente per te, realizzerà che è un dizionario e quindi completerà automaticamente anche i Allows Arbitrarycarichi. screenshot di info.plist


Ciò consentirà tutte le richieste http. Funziona, ma non raccomandato.
KVISH

2

Risolvi bug NSURLConnection Caricamento HTTP non riuscito Basta aggiungere il seguente Dict in info.plist:

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

1

L'ho risolto con l'aggiunta di una chiave in info.plist. I passaggi che ho seguito sono:

Ho aperto il file info.plist del mio progetto

Aggiunta una chiave denominata NSAppTransportSecurity come dizionario.

Aggiunta una sottochiave chiamata NSAllowsArbitraryLoads come booleana e impostato il valore su YES 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


1

Questo è ciò che ha funzionato per me quando ho avuto questo errore:

<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

Puoi provare ad aggiungere questa funzione nel file RCTHTTPRequestHandler.m

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


1

Oltre alle risposte sopra menzionate, ricontrolla il tuo URL


Nel mio caso stavo provando a caricare il file .html.
Vaishnavi,

0

Si dovrebbe aggiungere App Transport Security Settingsper info.pliste aggiungere Allow Arbitrary LoadsaApp Transport Security Settings

inserisci qui la descrizione dell'immagine

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
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.