La ressource n'a pas pu être chargée car la stratégie de sécurité du transport d'application nécessite l'utilisation d'une connexion sécurisée


492

Je fais face au problème lorsque j'ai mis à jour mon Xcode vers 7.0 ou iOS 9.0. D'une manière ou d'une autre, cela a commencé à me donner l'erreur intitulée

"La ressource n'a pas pu être chargée car la stratégie de sécurité du transport d'application nécessite l'utilisation d'une connexion sécurisée"

Méthode de Webservice:

-(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];

}

Le service fonctionne correctement pour les versions antérieures de Xcode et les versions précédentes d'iOS Mais lorsque j'ai mis à jour vers Xcode 7.0 qui est sur iOS 9.0, il a commencé à me poser le problème comme suit lorsque j'appelle la méthode de service Web ci-dessus. L'erreur enregistrée que j'obtiens est:

Échec de la connexion: Erreur Domain = NSURLErrorDomain Code = -1022 "La ressource n'a pas pu être chargée car la stratégie de sécurité du transport d'application nécessite l'utilisation d'une connexion sécurisée." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , NSLocalizedDescription = La ressource pourrait ne pas sécuriser l'utilisation de l'application connexion.}

J'ai essayé de suivre les questions et réponses, mais je n'ai obtenu aucun résultat, y a-t-il une idée à l'avance de la façon de supprimer cette erreur d'appel de service?

  1. La ressource n'a pas pu être chargée est ios9
  2. App Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

Réponses:


936

Je l'ai résolu en ajoutant une clé dans info.plist. Les étapes que j'ai suivies sont:

  1. Ouverture du info.plistfichier de ma cible de projet

  2. Ajout d'une clé appelée NSAppTransportSecuritycomme Dictionary.

  3. Ajout d'une sous-clé appelée NSAllowsArbitraryLoadsas Booleanet définissez sa valeur YEScomme sur l'image suivante.

entrez la description de l'image ici

Nettoyez le projet et maintenant tout fonctionne bien comme avant.

Lien de référence: https://stackoverflow.com/a/32609970

EDIT: OU Dans le code source du info.plistfichier, nous pouvons ajouter que:

<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
Ça ne marche pas au début. Vous devez également ajouter les clés à l'intérieur de Project> Target
orafaelreis


1
@MihirOza: Oui, la sécurité des transports est une nouvelle fonctionnalité d'iOS 9.
Dominic K

2
Si vous n'avez aucun domaine d'exception, supprimez simplement n'importe quelle clé sous NSExceptionDomains. Sinon, ce sera une exception NSAllowArbitraryLoads, alors vous devez utiliser https pour visiter ceciexception
DawnSong

7
Pour Xcode 8.3 / Swift 3, c'est App Transport Security Settingset Allow Arbitrary Loadsrespectivement
Swapna Lekshmanan

280

Soyez conscient, l'utilisation NSAllowsArbitraryLoads = truedans le projet info.plistpermet à toute connexion à n'importe quel serveur d'être non sécurisée. Si vous voulez vous assurer que seul un domaine spécifique est accessible via une connexion non sécurisée, essayez ceci:

entrez la description de l'image ici

Ou, comme code source:

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

Projet Clean & Build après modification.


merci pour votre réponse juste NSAllowArbitaryLoads n'a pas fonctionné pour moi en ajoutant NSExceptionAllowsInsecureHTTPLoads a fait l'affaire
neeta

1
J'ai également ajouté ces deux clés: <! - Inclure pour autoriser les requêtes HTTP -> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - Inclure pour spécifier la version TLS minimale -> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </string> Cela l'a également fait charger beaucoup plus rapidement.
Sandy D.

Remarque: j'utilise XCode 8 maintenant: si vous faites cela manuellement, assurez-vous de cliquer avec le bouton droit sur le domaine> Type de valeur> Dictionnaire pour ajouter "..AllowsInsecure ..." et "...
IncludeSubdomains

Ne fonctionne pas si je spécifie le numéro de port après domain.com. (domain.com:3001 par exemple)
Shamsiddin

43

La sécurité du transport est fournie dans iOS 9.0 ou version ultérieure, et dans OS X v10.11 et version ultérieure.

Par défaut, seuls les appels https ne sont autorisés que dans les applications. Pour désactiver App Transport Security, ajoutez les lignes suivantes dans le fichier info.plist ...

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

Pour plus d'informations:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


Mais cela ne me permet toujours pas de faire un appel HTTP vers n'importe quel domaine. Y a-t-il un indice pourquoi cela se produit-il?
Mrug

Même son URL HTTP, l'URL doit être vérifiée ou doit avoir un certificat SSL vlid.
Teja Kumar Bethina

35

Pour iOS 10.x et Swift 3.x [les versions ci-dessous sont également prises en charge] ajoutez simplement les lignes suivantes dans 'info.plist'

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

1
Pour 10.x et Swift 3.x, j'avais vu ailleurs que les clés étaient en fait AppTransportSecurity et AllowsArbitraryLoads mais elles étaient fausses. le préfixe NS est toujours nécessaire pour ces clés, même pour Swift 3.x. L'erreur a disparu lorsque je me suis appuyé sur le préfixe NS pour ces clés.
Jazzmine

27

Dans Swift 4, vous pouvez utiliser

-> Aller Info.plist

-> Cliquez sur plus de la liste des propriétés de l'information

-> Ajouter des paramètres de sécurité de transport d'application en tant que dictionnaire

-> Cliquez sur l'icône Plus Paramètres de sécurité du transport d'application

-> Ajouter Autoriser les charges arbitraires défini OUI

L'image ci-dessous ressemble

entrez la description de l'image ici


23

J'ai résolu comme fichier plist.

Ajoutez un NSAppTransportSecurity: Dictionary.

Ajouter une sous-clé nommée "NSAllowsArbitraryLoads" en tant que booléen: OUI

entrez la description de l'image ici


18

La ressource n'a pas pu être chargée car la stratégie de sécurité du transport d'application nécessite l'utilisation d'une connexion sécurisée fonctionnant dans Swift 4.03.

Ouvrez votre pList.info en tant que code source et collez:

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

13

De la documentation Apple

Si vous développez une nouvelle application, vous devez utiliser HTTPS exclusivement. Si vous avez une application existante, vous devez utiliser HTTPS autant que possible en ce moment et créer un plan pour migrer le reste de votre application dès que possible. De plus, votre communication via des API de niveau supérieur doit être chiffrée à l'aide de TLS version 1.2 avec secret à terme. Si vous essayez d'établir une connexion qui ne respecte pas cette exigence, une erreur est générée. Si votre application doit faire une demande à un domaine non sécurisé, vous devez spécifier ce domaine dans le fichier Info.plist de votre application.

Pour contourner la sécurité du transport d'application:

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

Pour autoriser tous les domaines non sécurisés

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

En savoir plus: Configuration des exceptions de sécurité de transport d'application dans iOS 9 et OSX 10.11



9

À partir de Xcode 7.1 (swift 2.0)

entrez la description de l'image ici


9

C'est la façon qu'Apple impose de renforcer la sécurité sur vos API (forcé d'utiliser https sur http). Je vais vous expliquer comment supprimer ce paramètre de sécurité.


La plupart des réponses ici soulignent l'ajout de cette clé à votre info.plist entrez la description de l'image ici

Cela seul n'a pas résolu ce problème pour moi. J'ai dû ajouter la même clé à l'intérieur

Project -> Targets -> Info -> Custom iOS Target Properties entrez la description de l'image ici


Cela permettra cependant à des connexions non sécurisées de se produire. Si vous souhaitez autoriser uniquement un domaine spécifique à utiliser des connexions non sécurisées, vous pouvez ajouter ce qui suit à votre info.plist.

entrez la description de l'image ici


Merci, cela a fonctionné pour moi! J'ai seulement édité le fichier plist avant ce qui ne fonctionnait pas. Je suis surpris de voir comment d'autres personnes l'ont fait fonctionner de cette façon
jones

8

Vous avez juste besoin d'utiliser HTTPS et non HTTP dans votre URL et cela fonctionnera


3
À moins, bien sûr, que vous ne puissiez pas utiliser HTTPS car Apple n'aime pas les certificats auto-signés. N'avez-vous pas ce problème?
Tony B

1
Dans mon cas, cela fonctionne parfaitement depuis que j'ai changé pour HTTPS
pierre23

1
mais utilisez-vous un certificat auto-signé ou signé par une autorité de certification? Juste curieux. Une sorte de problème distinct, bien sûr, mais je pensais que je demanderais.
Tony B

Je n'ai pas travaillé côté serveur, je ne sais pas pour être honnête :(
pierre23

La configuration de la connexion HTTPS sur certains environnements de serveur (hébergement partagé) peut être difficile.
Raptor

7

Si vous n'êtes pas un grand fan de XML, ajoutez simplement la balise ci-dessous dans votre fichier plist.

entrez la description de l'image ici


5

iOS 9 (peut) forcer les développeurs à utiliser exclusivement App Transport Security . J'ai entendu cela quelque part au hasard, donc je ne sais pas si c'est vrai moi-même. Mais je le soupçonne et je suis arrivé à cette conclusion:

L'application fonctionnant sur iOS 9 ne se connectera peut-être plus à un serveur Meteor sans SSL.

Cela signifie que l'exécution de meteor run ios ou meteor run ios-device ne fonctionnera (probablement?) Plus.

Dans info.plist de l'application, NSAppTransportSecurity [Dictionary]doit avoir une clé NSAllowsArbitraryLoads [Boolean]à définir YESou Meteor doit l'utiliser httpspour localhost serverbientôt.


5

Si vous utilisez Xcode 8.0 à 8.3.3 et swift 2.2 à 3.0

Dans mon cas, vous devez changer l'URL http: // en https: // (si cela ne fonctionne pas, essayez)

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

entrez la description de l'image ici


3

Ouvrez votre pList.info en tant que code source et en bas juste avant d' </dict>ajouter le code suivant,

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

Et changez enfin your.domain.comavec votre URL de base. Merci.


3

Pour ceux d'entre vous qui développent sur localhost, procédez comme suit:

  1. Appuyez sur le bouton "+" à côté de Information Property Listet ajoutez App Transport Security Settingset attribuez-lui un Dictionarytype
  2. Appuyez sur le bouton "+" à côté de l' App Transport Security Settingsentrée nouvellement créée et ajoutez NSExceptionAllowsInsecureHTTPLoadsdu type Booleanet définissez sa valeur sur YES.
  3. Faites un clic droit sur l' NSExceptionAllowsInsecureHTTPLoadsentrée et cliquez sur l'option "Shift Row Right" pour en faire un enfant de l'entrée ci-dessus.
  4. Appuyez sur le bouton "+" à côté de l' NSExceptionAllowsInsecureHTTPLoadsentrée et ajoutez Allow Arbitrary Loadsdu type Booleanet définissez sa valeur surYES

Remarque: il devrait à la fin ressembler à quelque chose comme présenté dans l'image suivante

entrez la description de l'image ici


2

J'ai réussi à résoudre ce problème avec une combinaison de nombreuses options mentionnées. Je vais inclure une liste de contrôle de toutes les choses que je devais faire pour que cela fonctionne.

En bref:

  1. Défini NSAllowsArbitraryLoadssur true pour mon extension de montre (pas mon application de montre).
  2. Assurez-vous que j'utilisais httpset non http.

La première étape:

Tout d'abord et le plus évidemment, j'ai dû ajouter une NSAppTransportSecurityclé en tant que dictionnaire dans l'extension de ma montre info.plistavec une sous-clé appelée en NSAllowsArbitraryLoadstant que booléen définie sur true. Ne le définissez que dans l'extension de la montre et non dans le plist de l'application de montre. Bien noter que cela permet toutes les connexions et pourrait être peu sûr.

entrez la description de l'image ici

ou

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

Deuxième étape:

Ensuite, je devais m'assurer que l'URL que j'essayais de charger était httpset pas seulement http. Pour toutes les URL qui étaient encore http, j'ai utilisé:

Rapide :

let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")

Obj-C:

NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];


2

Assurez-vous de modifier le bon fichier info.plist .

C'est la deuxième fois que je perds du temps sur ce problème, car je n'ai pas remarqué que je change info.plist sous MyProjectNameUITests.


1

Si vous utilisez Firebase, il s'ajoutera NSAllowsArbitraryLoadsInWebContent = truedans la NSAppTransportSecuritysection et NSAllowsArbitraryLoads = truene fonctionnera pas


Merci pour cette information. Vous m'avez sauvé des heures de dépannage.
pAkY88

0

J'ai résolu ce problème dans le cas d'un serveur d'analyse auto-hébergé utilisant un certificat signé d'un an plutôt que l'option "NSAllowsArbitraryLoads"

Analyser le serveur comme n'importe quel serveur node.js présente une URL https publique que vous devez spécifier. Par exemple:

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

N'hésitez pas à jeter un œil à mes fichiers de configuration

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.