Ich habe das Problem, wenn ich meinen Xcode auf 7.0 oder iOS 9.0 aktualisiert habe. Irgendwie gab es mir den Titelfehler
"Die Ressource konnte nicht geladen werden, da für die App Transport Security-Richtlinie eine sichere Verbindung erforderlich ist."
Webservice-Methode:
-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
[sessionConfiguration setAllowsCellularAccess:YES];
[sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
NSLog(@"URl %@%@",url,DataString);
// Configure the Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPMethod = @"Post";
// post the request and handle response
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
// Handle the Response
if(error)
{
NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);
// Update the View
dispatch_async(dispatch_get_main_queue(), ^{
// Hide the Loader
[MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES];
});
return;
}
NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL];
for (NSHTTPCookie * cookie in cookies)
{
NSLog(@"%@=%@", cookie.name, cookie.value);
strSessName=cookie.name;
strSessVal=cookie.value;
}
NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];
[postDataTask resume];
}
Der Dienst läuft einwandfrei für frühere Xcode-Versionen und frühere iOS-Versionen. Wenn ich jedoch auf Xcode 7.0 unter iOS 9.0 aktualisiert habe, tritt beim Aufrufen der oben genannten Webdienstmethode das folgende Problem auf. Der protokollierte Fehler, den ich erhalte, ist:
Verbindung fehlgeschlagen: Fehlerdomäne = NSURLErrorDomain Code = -1022 "Die Ressource konnte nicht geladen werden, da für die App Transport Security-Richtlinie eine sichere Verbindung erforderlich ist." Userinfo = {NSUnderlyingError = 0x7fada0f31880 {Fehler Domain = kCFErrorDomainCFNetwork - Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , NSLocalizedDescription = Die Ressource nicht , weil die Politik App Transport Security geladen werden konnte erfordert die Verwendung eines sicheren Verbindung.}
Ich habe versucht, Fragen und Antworten zu folgen, habe dort jedoch kein Ergebnis erhalten. Gibt es eine Vorabidee, wie ich diesen Service-Anruf-Fehler beheben kann?
quelle
Antworten:
Ich habe es durch Hinzufügen eines Schlüssels in info.plist gelöst. Die Schritte, die ich befolgt habe, sind:
Öffnete die
info.plist
Datei meines ProjektzielsEin Schlüssel namens
NSAppTransportSecurity
a wurde hinzugefügtDictionary
.NSAllowsArbitraryLoads
,Boolean
und der Wert wurdeYES
wie im folgenden Bild festgelegt.Bereinigen Sie das Projekt und jetzt läuft alles wie zuvor.
Referenzlink: https://stackoverflow.com/a/32609970
BEARBEITEN: ODER Im Quellcode der
info.plist
Datei können wir Folgendes hinzufügen:quelle
NSExceptionDomains
. Oder es wird eine Ausnahme seinNSAllowArbitraryLoads
, dann müssen Sie https verwenden, um dies zu besuchenexception
App Transport Security Settings
undAllow Arbitrary Loads
jeweilsBeachten Sie, dass bei Verwendung
NSAllowsArbitraryLoads = true
in den Projekten dieinfo.plist
Verbindung zu jedem Server unsicher sein kann. Wenn Sie sicherstellen möchten, dass nur eine bestimmte Domäne über eine unsichere Verbindung zugänglich ist, versuchen Sie Folgendes:Oder als Quellcode:
Clean & Build-Projekt nach der Bearbeitung.
quelle
Die Transportsicherheit wird in iOS 9.0 oder höher und in OS X 10.11 und höher bereitgestellt.
Daher sind standardmäßig nur https- Anrufe nur in Apps zulässig. Um App Transport Security zu deaktivieren, fügen Sie die folgenden Zeilen in die Datei info.plist ein ...
Weitere Informationen:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33
quelle
Für iOS 10.x und Swift 3.x [die folgenden Versionen werden ebenfalls unterstützt] fügen Sie einfach die folgenden Zeilen in 'info.plist' ein.
quelle
In Swift 4 können Sie verwenden
-> Gehe zu Info.plist
-> Klicken Sie in der Liste der Informationseigenschaften auf Plus
-> App Transport Security-Einstellungen als Wörterbuch hinzufügen
-> Klicken Sie auf das Plus-Symbol App Transport Security Settings
-> Add Allow Arbitrary Loads set YES
Das folgende Bild sieht aus wie
quelle
Ich habe als Plist-Datei gelöst.
Fügen Sie ein NSAppTransportSecurity: Dictionary hinzu.
Fügen Sie den Unterschlüssel "NSAllowsArbitraryLoads" als Boolean: YES hinzu
quelle
Die Ressource konnte nicht geladen werden, da für die App Transport Security-Richtlinie die Verwendung einer sicheren Verbindung in Swift 4.03 erforderlich ist.
Öffnen Sie Ihre pList.info als Quellcode und fügen Sie Folgendes ein:
quelle
Aus der Apple-Dokumentation
Wenn Sie eine neue App entwickeln, sollten Sie ausschließlich HTTPS verwenden. Wenn Sie über eine vorhandene App verfügen, sollten Sie HTTPS so oft wie möglich verwenden und einen Plan erstellen, um den Rest Ihrer App so schnell wie möglich zu migrieren. Darüber hinaus muss Ihre Kommunikation über übergeordnete APIs mit TLS Version 1.2 mit Vorwärtsgeheimnis verschlüsselt werden. Wenn Sie versuchen, eine Verbindung herzustellen, die dieser Anforderung nicht entspricht, wird ein Fehler ausgegeben. Wenn Ihre App eine Anfrage an eine unsichere Domain stellen muss, müssen Sie diese Domain in der Info.plist-Datei Ihrer App angeben.
So umgehen Sie die App-Transportsicherheit:
Um alle unsicheren Domänen zuzulassen
Weitere Informationen : Konfigurieren von Sicherheitsausnahmen für den App-Transport in iOS 9 und OSX 10.11
quelle
Wenn Sie Xcode 8.0 und Swift 3.0 oder 2.2 verwenden
quelle
Ab Xcode 7.1 (schnell 2.0)
quelle
Auf diese Weise erzwingt Apple eine strengere Sicherheit für Ihre APIs (gezwungen, https über http zu verwenden). Ich werde erklären, wie diese Sicherheitseinstellung entfernt wird.
Die meisten Antworten hier weisen darauf hin, dass Sie diesen Schlüssel zu Ihrer info.plist hinzufügen
Dies allein hat dieses Problem für mich nicht gelöst. Ich musste den gleichen Schlüssel nach innen hinzufügen
Project -> Targets -> Info -> Custom iOS Target Properties
Dies ermöglicht jedoch unsichere Verbindungen von jedermann. Wenn Sie nur einer bestimmten Domain erlauben möchten, unsichere Verbindungen herzustellen, können Sie Ihrer info.plist Folgendes hinzufügen.
quelle
Sie müssen nur HTTPS und nicht HTTP in Ihrer URL verwenden, und es wird funktionieren
quelle
Wenn Sie kein großer XML-Fan sind, fügen Sie einfach das folgende Tag in Ihre Plist-Datei ein.
quelle
iOS 9 (möglicherweise) zwingt Entwickler, ausschließlich App Transport Security zu verwenden . Ich habe das irgendwo zufällig gehört, also weiß ich nicht, ob das selbst wahr ist. Aber ich vermute es und bin zu diesem Schluss gekommen:
Die App, die unter iOS 9 ausgeführt wird, stellt (möglicherweise) keine Verbindung mehr zu einem Meteor-Server ohne SSL her.
Dies bedeutet, dass das Ausführen von meteor run ios oder meteor run ios-device (wahrscheinlich?) Nicht mehr funktioniert.
In der info.plist der App
NSAppTransportSecurity [Dictionary]
muss ein SchlüsselNSAllowsArbitraryLoads [Boolean]
eingestellt sein, denYES
Meteorhttps
für dielocalhost server
bald verwenden muss.quelle
Wenn Sie Xcode 8.0 bis 8.3.3 verwenden und schnell 2.2 bis 3.0
quelle
Öffnen Sie Ihre pList.info als Quellcode und
</dict>
fügen Sie unten kurz den folgenden Code hinzu:Und schließlich ändern Sie
your.domain.com
mit Ihrer Basis-URL. Vielen Dank.quelle
Für diejenigen unter Ihnen, die sich auf localhost entwickeln, gehen Sie folgendermaßen vor:
Information Property List
und fügenApp Transport Security Settings
Sie einenDictionary
Typ hinzu und weisen Sie ihm zuApp Transport Security Settings
Eintrag und fügen Sie denNSExceptionAllowsInsecureHTTPLoads
Typ hinzuBoolean
und setzen Sie den Wert aufYES
.NSExceptionAllowsInsecureHTTPLoads
Sie mit der rechten Maustaste auf den Eintrag und klicken Sie auf die Option "Zeile nach rechts verschieben", um ihn zu einem untergeordneten Element des obigen Eintrags zu machen.NSExceptionAllowsInsecureHTTPLoads
Eintrag und fügen Sie denAllow Arbitrary Loads
Typ hinzuBoolean
und setzen Sie den Wert aufYES
Hinweis: Am Ende sollte es ungefähr so aussehen wie im folgenden Bild dargestellt
quelle
Ich habe es geschafft, dies mit einer Kombination aus vielen der genannten Optionen zu lösen. Ich werde eine Checkliste aller Dinge beifügen, die ich tun musste, damit dies funktioniert.
Zusamenfassend:
NSAllowsArbitraryLoads
für meine Uhrenerweiterung (nicht für meine Uhren-App) auf true.https
und nichthttp
.Schritt eins:
Zuerst und am offensichtlichsten musste ich einen
NSAppTransportSecurity
Schlüssel als Wörterbuch in meine Watch-Erweiterunginfo.plist
einfügen , wobei ein UnterschlüsselNSAllowsArbitraryLoads
als Boolescher Wert auf true gesetzt wurde. Stellen Sie dies nur in der Uhrenerweiterung ein und nicht in der Liste der Uhren-App. Beachten Sie jedoch, dass dies alle Verbindungen zulässt und unsicher sein kann.oder
Schritt zwei:
Dann musste ich sicherstellen, dass die URL, die ich laden wollte,
https
nicht nur warhttp
. Für alle URLs, die noch http waren, habe ich verwendet:Swift :
let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")
Obj-C:
NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];
quelle
Stellen Sie sicher, dass Sie die richtige Datei info.plist ändern .
Dies ist das zweite Mal, dass ich Zeit mit diesem Problem verschwende, da ich nicht bemerkt habe, dass ich info.plist unter MyProjectNameUITests ändere.
quelle
Wenn Sie Firebase verwenden, wird es
NSAllowsArbitraryLoadsInWebContent = true
imNSAppTransportSecurity
Abschnitt hinzugefügt undNSAllowsArbitraryLoads = true
funktioniert nichtquelle
Ich habe dieses Problem im Fall eines selbst gehosteten Analyseservers gelöst, der ein einjähriges signiertes Zertifikat anstelle der Option "NSAllowsArbitraryLoads" verwendet.
Analysieren Sie den Server, da jeder node.js-Server eine öffentliche https-URL anzeigt , die Sie angeben müssen. Zum Beispiel:
parse-server --appId --masterKey --publicServerURL https: //your.public.url/some_nodejs
Fühlen Sie sich frei, einen Blick auf meine Konfigurationsdateien zu werfen
quelle