Ich versuche, meine iOS-App mit einer HTTPS Rails App, die derzeit auf einem lokalen Host in meinem Netzwerk ausgeführt wird. Ich kann über meinen Browser mit https://myIP:3000/display
Auf die Site zugreifen. Ich versuche, von meiner App aus darauf zuzugreifen, indem ich Folgendes verwende:
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//let url = NSURL(string: "https://another/Sinatra/website/feed")
let url = NSURL(string: "https://myIP:3000/display")
let request = NSURLRequest(URL: url!)
let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
task!.resume()
}
Wenn ich versuche, auf die sinatra-Website zuzugreifen, habe ich keine Probleme und kann sogar den JSON-Code mit den richtigen Befehlen auf der Konsole ausdrucken. Wenn ich jedoch die URL zu meiner Rails Website einstelle, wird die folgende Fehlermeldung angezeigt.
HTTP-Laden von NSURLSession/NSURLConnection fehlgeschlagen (kCFStreamErrorDomainSSL, -9813)
Außerdem kann ich feststellen, dass meine localhost Rails App (auf dem anderen Computer) nicht über die iOS-App gepingt wird, sondern über den Browser und den Befehl curl.
Irgendwelche Ideen, wie man das behebt?
Wenn ich es richtig verstanden habe, möchten Apple jetzt, dass die Entwickler HTTPS und TLS 1.2 für Netzwerkanrufe verwenden.
Temporär können Sie dies in Ihrer "Info.plist" -Datei hinzufügen:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Schauen Sie einfach auf diesen Link, er kann Ihnen auch helfen: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/
-
Update : Nach einigen Kommentaren funktioniert die obige Lösung nicht mehr. Hier ist eine aktualisierte Lösung.
Info.plist
- Datei.Dictionary
und von SchlüsselApp Transport Security Settings
Hinzu.Boolean
, von SchlüsselAllow Arbitrary Loads
Und von WertYES
-
Andernfalls können Sie Domain Exceptions
Einstellen. So geht's:
Info.plist
- Datei.Dictionary
und von SchlüsselApp Transport Security Settings
Hinzu.Dictionary
und von SchlüsselException Domains
Hinzu.Dictionary
und von SchlüsselThe domain
Hinzu.Boolean
und von SchlüsselNSExceptionAllowsInsecureHTTPLoads
& NSIncludesSubdomains
mit Wert bis YES
.Links
Dies ist ein Vertrauensproblem. Bei einem selbstsignierten Zertifikat funktioniert die Identitätsprüfungskomponente von SSL nicht. Es ist immer noch möglich, eine sichere Verbindung herzustellen, damit niemand lauscht, aber die App kann nicht sicher sein, wer sich am anderen Ende der Leitung befindet.
Ich habe ein ähnliches Setup und habe dieses Problem behoben, indem ich meine selbstsignierte Stammzertifizierungsstelle zu den vertrauenswürdigen iPad-Zertifikaten hinzugefügt habe. Diese Stammzertifizierungsstelle wird zum Signieren aller anderen Entwicklungszertifikate verwendet. Dann muss ich nur dieses einzelne Stammzertifikat hinzufügen, wo immer SSL verwendet wird. Wenn Sie nur ein selbstsigniertes Zertifikat haben, das Sie direkt verwenden, können Sie das wahrscheinlich einfach hinzufügen.
Um das Zertifikat auf das Gerät (oder den Simulator) zu übertragen, habe ich die Datei auf meinem Webserver abgelegt. Dann öffnen Sie es einfach in Safari über normales HTTP. Die Einstellungen-App sollte geöffnet werden und Sie fragen, ob Sie dem Zertifikat vertrauen möchten.
Dies setzt natürlich voraus, dass dies nur für die Entwicklung gedacht ist und dass Ihr Produktionssystem über ein Zertifikat verfügt, das von einer bekannten Behörde signiert wurde (d. H. Eines, das in der Datenbank der Stammzertifizierungsstellen des Betriebssystems enthalten ist). Da die Aufforderung an Endbenutzer, Ihr selbstsigniertes Zertifikat zu installieren, nicht funktioniert.
Dies ist die einzige Lösung, die für mich funktioniert hat ... Geben Sie am Ende Ihrer AppDelegate.m-Datei den folgenden Code ein:
@implementation NSURLRequest(DataController)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host
{
return YES;
}
@end
Vielen Dank für jc ivancevich article http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-Android-ios/
(Bearbeiten - Ich habe das als 9814 falsch verstanden, abgelaufenes Zertifikat. Ich bin nicht sicher, wie ich das lösen soll, aber hoffentlich hilft meine Antwort dabei, in die richtige Richtung zu weisen.)
Sieht aus wie ein Zertifizierungsproblem, das sich von der üblichen Frage "Beliebige Ladevorgänge zulassen" unterscheidet.
Kurzer Auszug aus: Apple-Dokumentation - Anhang A: Allgemeine Fehler bei der Bewertung des Server-Vertrauens
NSOSStatusErrorDomain errSSLNoRootCert -9813
versuchen Sie, die Sitzungsvariable zu ändern. Diese Änderung hilft mir
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
Das Ändern der info.plist hat auch bei mir funktioniert.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>