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




nsurlconnection nsurlsession (14)

Ich stehe vor dem 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-Sicherheitsrichtlinie 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. Als ich jedoch ein Update auf Xcode 7.0 für iOS 9.0 durchgeführt habe, trat das folgende Problem auf, wenn ich die obige Webdienstmethode aufrief. Der protokollierte Fehler, den ich erhalte, ist:

Verbindung fehlgeschlagen: Fehlerdomäne = NSURLErrorDomain Code = -1022 "Die Ressource konnte nicht geladen werden, da die App Transport-Sicherheitsrichtlinie die Verwendung einer sicheren Verbindung erfordert." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Fehlerdomäne = kCFErrorDomainCFNetwork Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL Verbindung.}

Ich habe folgende Fragen und Antworten ausprobiert, habe dort jedoch kein Ergebnis erhalten. Gibt es eine vorläufige Idee, wie ich den Fehler bei einem Serviceabruf beheben kann?

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

Öffnen Sie Ihre pList.info als Quellcode und fügen Sie im unteren Bereich kurz vor </dict> 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.com mit Ihrer Basis-URL. Vielen Dank.


Ab Xcode 7.1 (swift 2.0)


Dies ist eine Methode von Apple, um die Sicherheit Ihrer Benutzeroberfläche zu erhöhen (erzwungene Verwendung von https über http). Ich werde erklären, wie diese Sicherheitseinstellung entfernt wird.

In den meisten Antworten wird darauf hingewiesen, 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

Dadurch können jedoch unsichere Verbindungen von jedem Benutzer hergestellt werden. Wenn Sie zulassen möchten, dass nur eine bestimmte Domain unsichere Verbindungen herstellt, können Sie Ihrer info.plist Folgendes hinzufügen.


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

  1. Tippen Sie auf die Schaltfläche "+" neben der Information Property List fügen Sie App Transport Security Settings und weisen Sie ihr einen Dictionary
  2. Tippen Sie auf die Schaltfläche "+" neben dem neu erstellten Eintrag für die App Transport Security Settings fügen Sie NSExceptionAllowsInsecureHTTPLoads vom Typ Boolean und setzen Sie den Wert auf YES .
  3. Klicken Sie mit der rechten NSExceptionAllowsInsecureHTTPLoads Eintrag NSExceptionAllowsInsecureHTTPLoads und klicken Sie auf die Option "Zeile nach rechts verschieben", um ihn zu einem NSExceptionAllowsInsecureHTTPLoads des obigen Eintrags zu machen.
  4. Tippen Sie auf die Schaltfläche "+" neben dem Eintrag NSExceptionAllowsInsecureHTTPLoads fügen Allow Arbitrary Loads vom Typ Boolean und setzen Sie den Wert auf YES

Hinweis: Am Ende sollte es so aussehen, wie es auf dem folgenden Bild dargestellt ist


Ich habe als plist Datei gelöst.

Fügen Sie ein NSAppTransportSecurity: Dictionary hinzu.

Fügen Sie den Unterschlüssel "NSAllowsArbitraryLoads" als Boolean hinzu: YES


Ich habe dieses Problem bei einem selbst gehosteten Analyse-Server mit einem einjährigen signierten Zertifikat und nicht mit der Option "NSAllowsArbitraryLoads" behoben.

Parse Server wie jeder node.js-Server zeigt eine öffentliche https-URL an , die Sie angeben müssen. Zum Beispiel:

Analyseserver --appId --masterKey --publicServerURL https://your.public.url/some_nodejs

Fühlen Sie sich frei, meine Konfigurationsdateien anzusehen


Ich habe es mit dem Hinzufügen eines Schlüssels in info.plist gelöst. Die Schritte, denen ich gefolgt bin, sind:

  1. info.plist die info.plist Datei meines info.plist

  2. Es wurde ein Schlüssel mit dem Namen NSAppTransportSecurity als Dictionary NSAppTransportSecurity .

  3. Es wurde ein Unterschlüssel mit dem Namen NSAllowsArbitraryLoads als Boolean NSAllowsArbitraryLoads und sein Wert auf YES , wie in der folgenden Abbildung dargestellt.

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

Ref Link: https://.com/a/32609970

BEARBEITEN: ODER Im Quellcode der Datei info.plist können wir info.plist 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>

In Swift 4 können Sie verwenden

-> Gehe zu Info.plist

-> Klicken Sie auf das Pluszeichen der Liste Informationseigenschaften

-> App Transport-Sicherheitseinstellungen als Wörterbuch hinzufügen

-> Klicken Sie auf das Plus-Symbol Sicherheitseinstellungen für App-Transport

-> Add Allow Arbitrary Loads setzen Sie YES

Das Bild unten sieht aus wie


Wenn Sie Xcode 8.0 und Swift 3.0 oder 2.2 verwenden


Wenn Sie kein großer XML-Fan sind, fügen Sie einfach den folgenden Tag in Ihre plist-Datei ein.


NSAllowsArbitraryLoads = true , dass durch Verwendung von NSAllowsArbitraryLoads = true in der info.plist des Projekts die gesamte Verbindung zu einem beliebigen Server unsicher wird. Wenn Sie sicherstellen möchten, dass nur eine bestimmte Domain über eine unsichere Verbindung erreichbar ist, versuchen Sie Folgendes:

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.


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 so schnell wie möglich einen Plan für die Migration des Restes Ihrer App erstellen. 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 Sicherheit des App-Transports:

<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 App Transport-Sicherheitsausnahmen in iOS 9 und OSX 10.11


Stellen Sie sicher, dass Sie die richtige info.plist-Datei ändern .

Dies ist das zweite Mal, dass ich Zeit mit diesem Problem vergeude, da ich nicht bemerkt habe, dass ich info.plist unter MyProjectNameUITests ändere.


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

In meinem Fall muss die URL http: // zu https: // geändert werden (wenn es 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: .com)

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







xcode7