web-dev-qa-db-fra.com

NSURLSession/NSURLConnection Le chargement HTTP a échoué sur iOS 9

J'ai essayé d'exécuter mon application existante sur iOS9, mais cela a échoué en utilisant AFURLSessionManager.

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

    } else {

    }
}];

[task resume];

Je reçois l'erreur suivante:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Obtenir également les journaux suivants: 

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

Mise à jour: J'ai ajouté plusieurs mises à jour à ma solution: NSURLSession/NSURLConnection Le chargement HTTP a échoué sur iOS 9

132
Tariq

Solution trouvée:

Dans iOS9, ATS applique les meilleures pratiques lors d'appels réseau, y compris l'utilisation de HTTPS.

D'après la documentation Apple:

ATS empêche la divulgation accidentelle, offre un comportement par défaut sécurisé et est facile à adopter. Vous devez adopter ATS dès que possible, que vous créiez une nouvelle application ou que vous en mettiez à jour une existante. Si vous développez une nouvelle application, vous devez utiliser exclusivement HTTPS. Si vous avez une application existante, vous devez utiliser autant que possible HTTPS et créer un plan pour migrer le reste de votre application dès que possible.

En version bêta 1, il n’existe actuellement aucun moyen de définir cela dans info.plist. La solution est de l'ajouter manuellement:

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

enter image description here

Update1: _ {il s'agit d'une solution temporaire jusqu'à ce que vous soyez prêt à adopter la prise en charge iOS9 ATS. 

Update2: Pour plus de détails, veuillez consulter le lien suivant: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10 -11/

Update3: Si vous essayez de vous connecter à un hôte (YOURHOST.COM) uniquement doté de TLS 1.0.

Ajoutez-les à l'Info.plist de votre application

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

Comment gérer le SSL dans iOS9? Une solution consiste à:

En tant que Apple dire: enter image description hereenter image description here

enter image description here

iOS 9 et OSX 10.11 requièrent TLSv1.2 SSL pour tous les hôtes à partir desquels vous prévoyez de demander des données, sauf si vous spécifiez des domaines d'exception dans le fichier Info.plist de votre application.

La syntaxe de la configuration Info.plist ressemble à ceci:

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

Si votre application (un navigateur Web tiers, par exemple) doit se connecter à des hôtes arbitraires, vous pouvez la configurer comme suit:

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

Si vous devez le faire, il est probablement préférable de mettre à jour vos serveurs pour qu'ils utilisent TLSv1.2 et SSL, s'ils ne le font pas déjà. Cela devrait être considéré comme une solution de contournement temporaire.

À ce jour, la documentation de la pré-version ne mentionne aucune de ces options de configuration de manière spécifique. Une fois que ce sera fait, je mettrai à jour la réponse afin de renvoyer à la documentation pertinente.

Pour plus d'informations, accédez à iOS9AdaptationTips

52
ElonChan

La note technique d'Apple sur la sécurité des transports d'applications est très pratique ; cela nous a aidé à trouver une solution plus sécurisée à notre problème.

J'espère que cela aidera quelqu'un d'autre. Nous avions des problèmes de connexion aux URL Amazon S3 qui semblaient parfaitement valables, les URL HTTPS TLSv12. Il s'avère que nous avons dû désactiver NSExceptionRequiresForwardSecrecy pour activer une autre poignée de chiffrements utilisés par S3.

Dans notre 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>
39
Ben Kreeger

Si vous rencontrez ce problème avec Amazon S3 en tant que moi, essayez de le coller sur votre info.plist en tant qu'enfant direct de votre balise de niveau supérieur.

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

Vous pouvez trouver plus d'infos sur:

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

6
David Cespedes

J'ai trouvé la solution de ici. Et ça marche pour moi.

Vérifiez ceci, cela peut vous aider.

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

Ajoutez simplement les champs suivants dans votre fichier .plist

 enter image description here

La syntaxe ressemble à ceci:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
3
geet Sebastian

Résoudre le bogue relatif à l'échec du chargement HTTP via NSURLConnection

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>
2
Sakir Sherasiya

Mettre à jour: 

A partir de Xcode 7.1, vous n'avez pas besoin de saisir manuellement le dictionnaire NSAppTransportSecurity dans le info.plist.

Il va maintenant effectuer la saisie semi-automatique pour vous, réalisez que c'est un dictionnaire, puis complétez également automatiquement les charges Allows Arbitrary. capture d'écran info.plist

1
Ben

C'est ce qui a fonctionné pour moi quand j'ai eu cette erreur:

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

Vous pouvez essayer d'ajouter cette fonction dans le fichier RCTHTTPRequestHandler.m

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

0
eliprodigy

En plus des réponses mentionnées ci-dessus, revérifier votre URL 

0
Vaishnavi

Je l'ai résolu en ajoutant quelques clés dans info.plist. Les étapes que j'ai suivies sont:

J'ai ouvert le fichier info.plist de mon projet

Ajout d'une clé appelée NSAppTransportSecurity en tant que dictionnaire.

Ajout d'une sous-clé appelée NSAllowsArbitraryLoads as Boolean et attribution de la valeur YES à l'image suivante . Enter image description here

Nettoyez le projet et tout fonctionne comme avant.

Lien de référence: https://stackoverflow.com/a/32609970

0
tania_S