El recurso no se pudo cargar porque la política de seguridad de transporte de aplicaciones requiere el uso de una conexión segura

492

Estoy enfrentando el problema cuando actualicé mi Xcode a 7.0 o iOS 9.0. De alguna manera comenzó a darme el error Titulado

"No se pudo cargar el recurso porque la política de seguridad de transporte de aplicaciones requiere el uso de una conexión segura"

Método de servicio web:

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

}

El servicio se está ejecutando bien para las versiones anteriores de Xcode y las versiones anteriores de iOS. Pero cuando actualicé a Xcode 7.0 que está en iOS 9.0, comenzó a darme el problema como el siguiente cuando llamo al método de servicio web anterior. El error registrado que obtengo es:

Error de conexión: Error Dominio = NSURLErrorDomain Código = -1022 "El recurso no se pudo cargar porque la política de seguridad de transporte de aplicaciones requiere el uso de una conexión segura". UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , NSLocalizedDescription es una política de seguridad porque el recurso no se puede cargar porque conexión.}

He intentado seguir las preguntas y respuestas, pero no obtuve ningún resultado, ¿hay alguna idea anticipada de cómo puedo eliminar ese error de llamada de servicio?

  1. El recurso no se pudo cargar es ios9
  2. Aplicación Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970
Manab Kumar Mal
fuente
posible duplicado de App Transport Security Xcode 7 beta 6
AiOsN

Respuestas:

936

Lo resolví agregando algunas claves en info.plist. Los pasos que seguí son:

  1. Abrí el info.plistarchivo de destino de mi proyecto

  2. Se agregó una clave llamada NSAppTransportSecuritycomo a Dictionary.

  3. Se agregó una subclave llamada NSAllowsArbitraryLoadsas Booleany estableció su valor YEScomo la siguiente imagen.

ingrese la descripción de la imagen aquí

Limpia el proyecto y ahora todo funciona bien como antes.

Enlace de referencia: https://stackoverflow.com/a/32609970

EDITAR: O En el código fuente del info.plistarchivo podemos agregar 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>
Manab Kumar Mal
fuente
55
No es trabajo al principio. También debe agregar las claves dentro de Proyecto> Destino
orafaelreis
44
Aquí hay algunos documentos útiles de Apple developer.apple.com/library/ios/documentation/General/Reference/…
LargeGlasses
1
@MihirOza: Sí, la seguridad del transporte es una nueva característica de iOS 9.
Dominic K
2
Si no tiene dominios de excepción, simplemente elimine cualquier clave debajo NSExceptionDomains. O de lo contrario será una excepción NSAllowArbitraryLoads, entonces debe usar https para visitar estoexception
DawnSong
77
Para Xcode 8.3 / Swift 3 es App Transport Security Settingsy Allow Arbitrary Loadsrespectivamente
Swapna Lekshmanan
280

Tenga en cuenta que el uso NSAllowsArbitraryLoads = trueen el proyecto info.plistpermite que toda conexión a cualquier servidor sea insegura. Si desea asegurarse de que solo se pueda acceder a un dominio específico a través de una conexión insegura, intente esto:

ingrese la descripción de la imagen aquí

O, como código fuente:

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

Proyecto Clean & Build después de la edición.

Arjan
fuente
gracias por su respuesta, solo NSAllowArbitaryLoads no funcionó para mí, agregar NSExceptionAllowsInsecureHTTPLoads hizo el truco
neeta
1
También agregué estas dos claves: <! - Incluir para permitir solicitudes HTTP -> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - Incluir para especificar la versión mínima de TLS -> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </string> También hizo que se cargara MUCHO más rápido.
Sandy D.
Nota: Estoy usando XCode 8 ahora: si está haciendo esto manualmente, asegúrese de hacer clic derecho en el dominio> Tipo de valor> Diccionario para agregar "..AllowsInsecure ..." y "... IncluyeSubdomains"
ArielSD
No funciona si especifico el número de puerto después de domain.com. (domain.com:3001 por ejemplo)
Shamsiddin
43

La seguridad de transporte se proporciona en iOS 9.0 o posterior, y en OS X v10.11 y posterior.

Entonces, de forma predeterminada, solo las llamadas https solo están permitidas en las aplicaciones. Para desactivar App Transport Security, agregue las siguientes líneas en el archivo info.plist ...

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

Para más información:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

Teja Kumar Bethina
fuente
Pero, esto todavía no me permite hacer llamadas HTTP a ningún dominio. ¿Hay alguna pista de por qué está sucediendo?
Mrug
Incluso es una URL HTTP, la URL debe ser verificada o debe tener un certificado SSL vlid.
Teja Kumar Bethina
35

Para iOS 10.xy Swift 3.x [también se admiten las siguientes versiones] solo agregue las siguientes líneas en 'info.plist'

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Mr. Bean
fuente
1
Para 10.xy Swift 3.x, había visto en otra parte que las claves eran en realidad AppTransportSecurity y AllowsArbitraryLoads, pero estaban equivocadas. El prefijo NS todavía es necesario para estas teclas, incluso para Swift 3.x. El error desapareció cuando confié en el prefijo NS para estas claves.
Jazzmine
27

En Swift 4 puedes usar

-> Ir a Info.plist

-> Haga clic en más de la lista de propiedades de información

-> Agregar configuración de seguridad de transporte de aplicaciones como diccionario

-> Haga clic en el ícono Plus Configuración de seguridad de transporte de la aplicación

-> Agregar Permitir cargas arbitrarias establecer

Imagen de abajo parece

ingrese la descripción de la imagen aquí

Enamul Haque
fuente
23

He resuelto como archivo plist.

Agregue un NSAppTransportSecurity: Diccionario.

Agregue la subclave denominada "NSAllowsArbitraryLoads" como booleana: SÍ

ingrese la descripción de la imagen aquí

Avinash651
fuente
18

El recurso no se pudo cargar porque la política de seguridad de transporte de aplicaciones requiere el uso de una conexión segura que funcione en Swift 4.03.

Abra su pList.info como código fuente y pegue:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
Keshav Gera
fuente
13

De la documentación de Apple

Si está desarrollando una nueva aplicación, debe usar HTTPS exclusivamente. Si tiene una aplicación existente, debe usar HTTPS tanto como pueda en este momento y crear un plan para migrar el resto de su aplicación lo antes posible. Además, su comunicación a través de API de nivel superior debe cifrarse con TLS versión 1.2 con confidencialidad directa. Si intenta establecer una conexión que no cumple con este requisito, se genera un error. Si su aplicación necesita hacer una solicitud a un dominio inseguro, debe especificar este dominio en el archivo Info.plist de su aplicación.

Para omitir la seguridad del transporte de aplicaciones:

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

Para permitir todos los dominios inseguros

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

Leer más: Configuración de excepciones de seguridad de transporte de aplicaciones en iOS 9 y OSX 10.11

Ashok R
fuente
11

Si está utilizando Xcode 8.0 y swift 3.0 o 2.2

ingrese la descripción de la imagen aquí

Anit Kumar
fuente
9

En Xcode 7.1 en adelante (swift 2.0)

ingrese la descripción de la imagen aquí

AG
fuente
9

Esta es la manera de Apple de forzar una seguridad más estricta en sus apis (obligado a usar https sobre http). Explicaré cómo eliminar esta configuración de seguridad.


La mayoría de las respuestas aquí señalan agregar esta clave a su info.plist ingrese la descripción de la imagen aquí

Esto por sí solo no resolvió este problema para mí. Tuve que agregar la misma llave al interior

Project -> Targets -> Info -> Custom iOS Target Properties ingrese la descripción de la imagen aquí


Sin embargo, esto permitirá que cualquier persona tenga conexiones inseguras. Si desea permitir que solo un dominio específico use conexiones inseguras, puede agregar lo siguiente a su info.plist.

ingrese la descripción de la imagen aquí

Sam
fuente
¡Gracias, esto funcionó para mí! Solo edité el archivo plist antes que no funcionó. Estoy sorprendido de cómo otras personas lo hicieron funcionar de esa manera
Jones
8

Solo necesita usar HTTPS y no HTTP en su URL y funcionará

pierre23
fuente
3
A menos, por supuesto, que no pueda usar HTTPS porque a Apple no le gustan los certificados autofirmados. ¿No tienes ese problema?
Tony B
1
En mi caso, funciona perfectamente desde que cambié a HTTPS
pierre23
1
pero ¿utiliza un certificado autofirmado o firmado por CA? Sólo curioso. Una especie de tema separado, por supuesto, pero pensé que lo preguntaría.
Tony B
No
trabajé
Configurar la conexión HTTPS en algunos entornos de servidor (alojamiento compartido) puede ser difícil.
Raptor
7

Si no eres un gran fanático de XML, simplemente agrega la etiqueta a continuación en tu archivo plist.

ingrese la descripción de la imagen aquí

MrWaqasAhmed
fuente
5

iOS 9 (puede) obligar a los desarrolladores a usar App Transport Security exclusivamente. Escuché esto en algún lugar al azar, así que no sé si esto también es cierto. Pero lo sospecho y he llegado a esta conclusión:

La aplicación que se ejecuta en iOS 9 (tal vez) ya no se conectará a un servidor Meteor sin SSL.

Esto significa que ejecutar meteor run ios o meteor run ios-device (¿probablemente?) Ya no funcionará.

En info.plist de la aplicación, NSAppTransportSecurity [Dictionary]tiene que tener una llave NSAllowsArbitraryLoads [Boolean]que se establece en YESo Meteor necesita usar httpspor su localhost serverpronto.

Mahesh
fuente
5

Si está utilizando Xcode 8.0 a 8.3.3 y swift 2.2 a 3.0

En mi caso, necesito cambiar la URL http: // a https: // (si no funciona, intente)

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

ingrese la descripción de la imagen aquí

Md Imran Choudhury
fuente
3

Abra su pList.info como código fuente y en la parte inferior justo antes de </dict>agregar el siguiente código,

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

Y finalmente cambia your.domain.comcon tu URL base. Gracias.

Najam
fuente
3

Para aquellos de ustedes que desarrollan en localhost, sigan estos pasos:

  1. Toque el botón "+" al lado Information Property Listy agregue App Transport Security Settingsy asígnele un DictionaryTipo
  2. Toque el botón "+" junto a la App Transport Security Settingsentrada recién creada y agregue el NSExceptionAllowsInsecureHTTPLoadstipo Booleany establezca su valor enYES .
  3. Haga clic derecho en NSExceptionAllowsInsecureHTTPLoads entrada y haga clic en la opción "Shift Row Right" para que sea un elemento secundario de la entrada anterior.
  4. Toque el botón "+" al lado de la NSExceptionAllowsInsecureHTTPLoadsentrada y agregue el Allow Arbitrary Loadstipo Booleany establezca su valor enYES

Nota: Al final, debería verse como se presenta en la siguiente imagen

ingrese la descripción de la imagen aquí

ISS
fuente
2

Logré resolver esto con una combinación de muchas de las opciones mencionadas. Incluiré una lista de verificación de todas las cosas que tuve que hacer para que esto funcione.

En breve:

  1. Establecer NSAllowsArbitraryLoadsen verdadero para mi extensión de reloj (no para mi aplicación de reloj).
  2. Asegúrese de que estaba usando httpsy no http.

Paso uno:

En primer lugar, y obviamente, tuve que agregar una NSAppTransportSecurityclave como diccionario en las extensiones de mi reloj info.plistcon una subclave llamada NSAllowsArbitraryLoadscomo un conjunto booleano en verdadero. Solo configure esto en la extensión del reloj y no en la aplicación de reloj. Aunque tenga en cuenta que esto permite todas las conexiones y podría ser inseguro.

ingrese la descripción de la imagen aquí

o

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

Segundo paso:

Luego tuve que asegurarme de que la URL que intentaba cargar era httpsy no solo http. Para cualquier URL que aún fuera http, utilicé:

Rápido :

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

Obj-C:

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

Gordium
fuente
2

Asegúrese de cambiar el archivo info.plist correcto .

Esta es la segunda vez que pierdo tiempo en este tema, porque no noté que estoy cambiando info.plist en MyProjectNameUITests.

Shefy Gur-ary
fuente
1

Si usa firebase, se agregará NSAllowsArbitraryLoadsInWebContent = trueen la NSAppTransportSecuritysección y NSAllowsArbitraryLoads = trueno funcionará

cn00
fuente
Gracias por esta información. Me ahorraste horas de solución de problemas.
pAkY88
0

He resuelto este problema en el caso de un servidor de análisis autohospedado que utiliza un certificado firmado por un año en lugar de la opción "NSAllowsArbitraryLoads"

Parse Server como cualquier servidor node.js presenta una URL pública https que debe especificar. Por ejemplo:

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

Siéntase libre de echar un vistazo a mis archivos de configuración

CyrIng
fuente