Das neue Beta-SDK für iOS, das gestern Abend veröffentlicht wurde, enthält "App Transport Security", das Entwickler dazu ermutigt, https anstelle von http zu verwenden. Im Prinzip ist dies eine großartige Idee, und ich verwende https bereits in unseren Staging-/Produktionsumgebungen. Ich habe jedoch kein https in meiner lokalen Entwicklungsumgebung eingerichtet, wenn die iOS-App eine Verbindung zu einem Webdienst herstellt, den ich auf meinem Laptop ausführe.
Nach einigem Hin und Her scheint das URL-Ladesystem, selbst wenn Sie ihm eine http-URL geben, sich dafür zu entscheiden, stattdessen https zu verwenden. Weiß jemand, wie man dieses Verhalten deaktiviert - auch nur für bestimmte URLs?
Ausführliche Informationen finden Sie in Apples Info.plist-Referenz (danke @ gnasher729).
Sie können Ausnahmen für bestimmte Domänen in Ihrer Info.plist hinzufügen:
<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>
Alle Schlüssel für jede ausgenommene Domäne sind optional. Der Redner hat keinen der Schlüssel herausgearbeitet, aber ich denke, sie sind alle einigermaßen offensichtlich.
(Quelle: WWDC 2015-Sitzung 703, „Datenschutz und Ihre App“ , 30:18)
Sie können auch alle App-Transport-Sicherheitsbeschränkungen mit einem einzigen Schlüssel ignorieren, wenn Ihre App einen guten Grund dafür hat:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Wenn Ihre App keinen guten Grund hat, können Sie die Ablehnung riskieren:
Wenn Sie NSAllowsArbitraryLoads auf true setzen, funktioniert dies, aber Apple wollte Apps, die dieses Flag verwenden, ohne bestimmten Grund ablehnen. Der Hauptgrund für die Verwendung von NSAllowsArbitraryLoads sind vom Benutzer erstellte Inhalte (gemeinsame Nutzung von Links, benutzerdefinierter Webbrowser usw.). In diesem Fall erwartet Apple weiterhin, dass Sie Ausnahmen einschließen, die den ATS für die URLs erzwingen, für die Sie die Kontrolle haben.
Wenn Sie Zugriff auf bestimmte URLs benötigen, die nicht über TLS 1.2 bereitgestellt werden, müssen Sie bestimmte Ausnahmen für diese Domänen schreiben. Verwenden Sie nicht NSAllowsArbitraryLoads, das auf yes festgelegt ist. Weitere Informationen finden Sie in der NSURLSesssion-WWDC-Sitzung.
Seien Sie bitte vorsichtig beim Teilen der NSAllowsArbitraryLoads-Lösung. Es ist nicht die von Apple empfohlene Lösung.
- kcharwood (danke @ marco-tolman)
Als akzeptierte Antwort wurden erforderliche Informationen bereitgestellt, und für weitere Informationen zur Verwendung von und Deaktivieren von App Transport Security finden Sie weitere Informationen daz .
Fügen Sie für domänenspezifische Ausnahmen diese zur Info.plist hinzu:
<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>
Aber was ist, wenn ich nicht alle unsicheren Domänen kenne, die ich verwenden muss? Verwenden Sie den folgenden Schlüssel in Ihren Informationen .plist
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Gefolgt von this .
Ich habe es mit dem Hinzufügen eines Schlüssels in info.plist gelöst. Die Schritte, denen ich gefolgt bin, sind:
Öffnete meine Projekte info.plist
Datei
Ein Schlüssel mit dem Namen NSAppTransportSecurity
wurde als Dictionary
hinzugefügt.
NSAllowsArbitraryLoads
als Boolean
hinzugefügt und sein Wert auf YES
gesetzt, wie in der folgenden Abbildung dargestellt. Bereinigen Sie das Projekt und jetzt läuft alles wie zuvor.
Ref Link .
Wenn Sie nur die App Transport-Richtlinie für lokale Entwickler-Server deaktivieren möchten, funktionieren die folgenden Lösungen einwandfrei. Dies ist hilfreich, wenn Sie HTTPS nicht einrichten können oder wenn dies nicht praktikabel ist (z. B. bei Verwendung des Google App Engine-Entwicklerservers).
Wie andere bereits gesagt haben, sollte ATP für Produktions-Apps auf keinen Fall deaktiviert werden.
Kopieren Sie Ihre Plist-Datei und NSAllowsArbitraryLoads. Verwenden Sie diese Plist zum Debuggen.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Alternativ können Sie eine einzelne plist-Datei verwenden und bestimmte Server ausschließen. Allerdings es sieht nicht so aus, als könnten Sie IP 4-Adressen ausschließen , sodass Sie möglicherweise stattdessen den Servernamen verwenden müssen (in den Systemeinstellungen -> Freigabe oder in Ihrem lokalen DNS konfiguriert).
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>server.local</key>
<dict/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
Die obigen Konfigurationen haben bei mir nicht funktioniert. Ich habe viele Tastenkombinationen ausprobiert, diese funktionieren einwandfrei:
<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>
Kompilieren der Antworten von @adurdin und @User
Fügen Sie Ihrer info.plist Folgendes hinzu und ändern Sie localhost.com
mit Ihrem entsprechenden Domain-Namen. Sie können auch mehrere Domains hinzufügen:
<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>
Ihre info.plist muss so aussehen:
Folgendes hat bei mir funktioniert:
<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>
Ich möchte dies nur hinzufügen, um anderen zu helfen und etwas Zeit zu sparen:
wenn Sie verwenden: CFStreamCreatePairWithSocketToHost
. Stellen Sie sicher, dass Ihr Host
mit dem in Ihrem .plist
übereinstimmt, oder fügen Sie ihn dort hinzu, wenn Sie eine separate Domain für den Socket haben.
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);
Hoffe das ist hilfreich. Prost. :)