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
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>
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>
Comment gérer le SSL dans iOS9? Une solution consiste à:
En tant que Apple dire:
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
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>
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
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>
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>
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
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>
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]);
}
En plus des réponses mentionnées ci-dessus, revérifier votre URL
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