Ainsi, le nouveau SDK bêta d’iOS publié la nuit dernière contient "App Transport Security", qui encourage les développeurs à utiliser https au lieu de http. En principe, c'est une excellente idée et j'utilise déjà https dans nos environnements de transfert et de production. Cependant, https n'a pas été configuré dans mon environnement de développement local, lorsque l'application iOS se connecte à un service Web que j'utilise sur mon ordinateur portable.
En jouant un peu ce matin, il semble que le système de chargement d’URL, même si vous lui transmettez une URL http, décide d’utiliser https à la place. Est-ce que quelqu'un sait comment désactiver ce comportement - même pour des URL particulières?
Voir le référence Info.plist d’Apple pour plus de détails (merci @ gnasher729).
Vous pouvez ajouter des exceptions pour des domaines spécifiques dans votre Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
Toutes les clés de chaque domaine excepté sont facultatives. L’orateur n’a précisé aucune des clés, mais je pense qu’elles sont toutes raisonnablement évidentes.
(Source: WWDC 2015 session 703, "La confidentialité et votre application" , 30:18)
Vous pouvez également ignorer toutes les restrictions de sécurité du transport d'applications avec une seule clé, si votre application a de bonnes raisons de le faire:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Si votre application n'a pas de bonne raison, vous risquez d'être rejeté.
Définir NSAllowsArbitraryLoads sur true lui permettra de fonctionner, mais Apple était très clair en ce sens qu'ils avaient l'intention de rejeter les applications qui utilisent cet indicateur sans raison spécifique. La principale raison d'utiliser NSAllowsArbitraryLoads est le contenu créé par l'utilisateur (partage de liens, navigateur Web personnalisé, etc.). Et dans ce cas, Apple s'attend toujours à ce que vous incluiez des exceptions qui appliquent l'ATS pour les URL dont vous avez le contrôle.
Si vous avez besoin d'accéder à des URL spécifiques non desservies par TLS 1.2, vous devez écrire des exceptions spécifiques pour ces domaines et ne pas utiliser NSAllowsArbitraryLoads défini sur yes. Vous trouverez plus d’informations dans la session NSURLSesssion WWDC.
Faites attention en partageant la solution NSAllowsArbitraryLoads. Ce n'est pas le correctif recommandé par Apple.
- kcharwood (merci @ marco-tolman)
En tant que réponse acceptée, la réponse a fourni les informations requises, et pour plus d'informations sur l'utilisation de et vous pouvez en savoir plus sur App Transport Security .
Pour les exceptions par domaine, ajoutez-les à Info.plist :
<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>
Mais que se passe-t-il si je ne connais pas tous les domaines non sécurisés que je dois utiliser? Utilisez la clé suivante dans vos informations .plist
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Suivi this .
Je l'ai résolu en ajoutant des clés dans info.plist. Les étapes que j'ai suivies sont:
Ouvert mon fichier de projets info.plist
Ajout d'une clé appelée NSAppTransportSecurity
en tant que Dictionary
.
NSAllowsArbitraryLoads
en tant que Boolean
et définissez sa valeur sur YES
en tant qu'image suivante. Nettoyez le projet et tout fonctionne comme avant.
Réf Lien .
Si vous souhaitez simplement désactiver la stratégie de transport d'application pour les serveurs de développement locaux, les solutions suivantes fonctionnent bien. C'est utile lorsque vous ne pouvez pas ou qu'il est peu pratique de configurer HTTPS (par exemple, lorsque vous utilisez le serveur de développement de Google App Engine).
Comme d'autres l'ont dit cependant, l'ATP ne devrait absolument pas être désactivé pour les applications de production.
Copiez votre fichier Plist et NSAllowsArbitraryLoads. Utilisez cette liste pour le débogage.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Alternativement, vous pouvez utiliser un seul fichier plist et exclure des serveurs spécifiques. Cependant, il ne semble pas que vous puissiez exclure les adresses IP 4 , vous devrez peut-être utiliser le nom du serveur (indiqué dans les Préférences Système -> Partage ou configuré dans votre DNS local).
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>server.local</key>
<dict/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
Les configurations ci-dessus ne fonctionnaient pas pour moi. J'ai essayé beaucoup de combinaisons de touches, celle-ci fonctionne bien:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>mydomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
Compiler les réponses données par @adurdin et @User
Ajoutez les éléments suivants à votre info.plist & change localhost.com
avec votre nom de domaine correspondant. Vous pouvez également ajouter plusieurs domaines:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
</plist>
Votre info.plist doit ressembler à ceci:
Voici ce qui a fonctionné pour moi:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key><!-- your_remote_server.com / localhost --></key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
<!-- add more domain here -->
</dict>
</dict>
Je veux juste ajouter ceci pour aider les autres et gagner du temps:
si vous utilisez: CFStreamCreatePairWithSocketToHost
. assurez-vous que votre Host
est identique à ce que vous avez dans votre .plist
ou si vous avez un domaine distinct pour socket, ajoutez-le simplement ici.
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);
J'espère que c'est utile. À votre santé. :)