Die Ressource konnte nicht geladen werden, da für die App Transport Security-Richtlinie eine sichere Verbindung erforderlich ist


491

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?

  1. Die Ressource, die nicht geladen werden konnte, ist ios9
  2. App Transport Security Xcode 7 Beta 6
  3. https://stackoverflow.com/a/32609970

Antworten:


935

Ich habe es durch Hinzufügen eines Schlüssels in info.plist gelöst. Die Schritte, die ich befolgt habe, sind:

  1. Öffnete die info.plistDatei meines Projektziels

  2. Ein Schlüssel namens NSAppTransportSecuritya wurde hinzugefügt Dictionary.

  3. Es wurde ein Unterschlüssel hinzugefügt, der als aufgerufen wurde NSAllowsArbitraryLoads, Booleanund der Wert wurde YESwie im folgenden Bild festgelegt.

Geben Sie hier die Bildbeschreibung ein

Bereinigen Sie das Projekt und jetzt läuft alles wie zuvor.

Referenzlink: https://stackoverflow.com/a/32609970

BEARBEITEN: ODER Im Quellcode der info.plistDatei können wir Folgendes hinzufügen:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
  </dict>

5
Zuerst funktioniert es nicht. Sie müssen die Schlüssel auch in Projekt> Ziel hinzufügen
orafaelreis


1
@MihirOza: Ja, Transportsicherheit ist eine neue Funktion von iOS 9.
Dominic K

2
Wenn Sie keine Ausnahmedomänen haben, entfernen Sie einfach einen Schlüssel unter NSExceptionDomains. Oder es wird eine Ausnahme sein NSAllowArbitraryLoads, dann müssen Sie https verwenden, um dies zu besuchenexception
DawnSong

7
Für Xcode 8.3 / Swift 3 ist App Transport Security Settingsund Allow Arbitrary Loadsjeweils
Swapna Lekshmanan

280

Beachten Sie, dass bei Verwendung NSAllowsArbitraryLoads = truein den Projekten die info.plistVerbindung 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:

Geben Sie hier die Bildbeschreibung ein

Oder als Quellcode:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>domain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Clean & Build-Projekt nach der Bearbeitung.


danke für deine Antwort, nur NSAllowArbitaryLoads hat bei mir nicht funktioniert. Das Hinzufügen von NSExceptionAllowsInsecureHTTPLoads hat den Trick gemacht
neeta

1
Ich habe auch diese beiden Schlüssel hinzugefügt: <! - Include, um HTTP-Anforderungen zuzulassen -> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </ key> <true /> <! - Include, um die minimale TLS-Version anzugeben -> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </ string> Dadurch wurde es auch viel schneller geladen.
Sandy D.

Hinweis: Ich verwende jetzt XCode 8: Wenn Sie dies manuell tun, klicken Sie mit der rechten Maustaste auf die Domäne> Werttyp> Wörterbuch, um "..AllowsInsecure ..." und "... IncludesSubdomains"
ArielSD hinzuzufügen

Funktioniert nicht, wenn ich die Portnummer nach domain.com angebe. (domain.com:3001 zum Beispiel)
Shamsiddin

43

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 ...

<key>NSAppTransportSecurity</key>
  <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
  </dict>

Weitere Informationen:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


Dadurch kann ich jedoch immer noch keine HTTP-Aufrufe für eine Domain tätigen. Gibt es einen Hinweis, warum es passiert?
Mrug

Auch wenn es sich um eine HTTP-URL handelt, sollte die URL verifiziert sein oder über ein vlid-SSL-Zertifikat verfügen.
Teja Kumar Bethina

35

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.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

1
Für 10.x und Swift 3.x hatte ich an anderer Stelle gesehen, dass die Schlüssel tatsächlich AppTransportSecurity und AllowsArbitraryLoads waren, aber diese waren falsch. Das NS-Präfix wird für diese Schlüssel auch für Swift 3.x weiterhin benötigt. Der Fehler verschwand, als ich mich für diese Schlüssel auf das NS-Präfix stützte.
Jazzmine

27

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

Geben Sie hier die Bildbeschreibung ein


23

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

Geben Sie hier die Bildbeschreibung ein


18

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:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

13

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:

<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>

Um alle unsicheren Domänen zuzulassen

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Weitere Informationen : Konfigurieren von Sicherheitsausnahmen für den App-Transport in iOS 9 und OSX 10.11




9

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 Geben Sie hier die Bildbeschreibung ein

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 Geben Sie hier die Bildbeschreibung ein


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.

Geben Sie hier die Bildbeschreibung ein


Danke, das hat bei mir funktioniert! Ich habe nur die Plist-Datei bearbeitet, vor der es nicht funktioniert hat.
Ich

8

Sie müssen nur HTTPS und nicht HTTP in Ihrer URL verwenden, und es wird funktionieren


3
Es sei denn, Sie können HTTPS natürlich nicht verwenden, da Apple selbstsignierte Zertifikate nicht mag. Hast du dieses Problem nicht?
Tony B

1
In meinem Fall funktioniert es perfekt, da ich
Uhr

1
Verwenden Sie jedoch ein selbstsigniertes oder ein CA-signiertes Zertifikat? Nur neugierig. Natürlich eine Art separates Problem, aber ich dachte, ich würde fragen.
Tony B

Ich habe nicht auf der Serverseite gearbeitet, ich weiß nicht, um ehrlich zu sein :(
pierre23

Das Einrichten einer HTTPS-Verbindung in einigen Serverumgebungen (Shared Hosting) ist möglicherweise schwierig.
Raptor

7

Wenn Sie kein großer XML-Fan sind, fügen Sie einfach das folgende Tag in Ihre Plist-Datei ein.

Geben Sie hier die Bildbeschreibung ein


5

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üssel NSAllowsArbitraryLoads [Boolean]eingestellt sein, den YESMeteor httpsfür die localhost serverbald verwenden muss.


5

Wenn Sie Xcode 8.0 bis 8.3.3 verwenden und schnell 2.2 bis 3.0

In meinem Fall muss die URL http: // in https: // geändert werden (wenn dies nicht funktioniert, versuchen Sie es)

Add an App Transport Security Setting: Dictionary.
Add a NSAppTransportSecurity: Dictionary.
Add a NSExceptionDomains: Dictionary.
Add a yourdomain.com: Dictionary.  (Ex: stackoverflow.com)

Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES

Geben Sie hier die Bildbeschreibung ein


3

Öffnen Sie Ihre pList.info als Quellcode und </dict>fügen Sie unten kurz den folgenden Code hinzu:

 <!--By Passing-->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.domain.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>
    <!--End Passing-->

Und schließlich ändern Sie your.domain.commit Ihrer Basis-URL. Vielen Dank.


3

Für diejenigen unter Ihnen, die sich auf localhost entwickeln, gehen Sie folgendermaßen vor:

  1. Tippen Sie auf die Schaltfläche "+" neben Information Property Listund fügen App Transport Security SettingsSie einen DictionaryTyp hinzu und weisen Sie ihm zu
  2. Tippen Sie auf die Schaltfläche "+" neben dem neu erstellten App Transport Security SettingsEintrag und fügen Sie den NSExceptionAllowsInsecureHTTPLoadsTyp hinzu Booleanund setzen Sie den Wert auf YES.
  3. Klicken NSExceptionAllowsInsecureHTTPLoadsSie 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.
  4. Tippen Sie auf die Schaltfläche "+" neben dem NSExceptionAllowsInsecureHTTPLoadsEintrag und fügen Sie den Allow Arbitrary LoadsTyp hinzu Booleanund setzen Sie den Wert aufYES

Hinweis: Am Ende sollte es ungefähr so ​​aussehen wie im folgenden Bild dargestellt

Geben Sie hier die Bildbeschreibung ein


2

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:

  1. Setzen Sie NSAllowsArbitraryLoadsfür meine Uhrenerweiterung (nicht für meine Uhren-App) auf true.
  2. Stellen Sie sicher, dass ich verwendet habe httpsund nicht http.

Schritt eins:

Zuerst und am offensichtlichsten musste ich einen NSAppTransportSecuritySchlüssel als Wörterbuch in meine Watch-Erweiterung info.plisteinfügen , wobei ein Unterschlüssel NSAllowsArbitraryLoadsals 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.

Geben Sie hier die Bildbeschreibung ein

oder

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Schritt zwei:

Dann musste ich sicherstellen, dass die URL, die ich laden wollte, httpsnicht nur war http. 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”];


2

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.


1

Wenn Sie Firebase verwenden, wird es NSAllowsArbitraryLoadsInWebContent = trueim NSAppTransportSecurityAbschnitt hinzugefügt und NSAllowsArbitraryLoads = truefunktioniert nicht


Danke für diese Information. Sie haben mir Stunden der Fehlerbehebung erspart.
pAkY88

0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.