ios - El recurso no se pudo cargar porque la política de seguridad de transporte de aplicaciones requiere el uso de una conexión segura
nsurlconnection nsurlsession (20)
Abra su
pList.info
como
código fuente
y en la parte inferior justo antes de
</dict>
agregue 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 cambie
your.domain.com
con su URL base.
Gracias.
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 de la cual el uso no se debe cargar. 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?
- El recurso no se pudo cargar es ios9
- Aplicación Transport Security Xcode 7 beta 6
- https://stackoverflow.com/a/32609970
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>
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 SÍ
Imagen de abajo parece
Esta es la forma 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
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
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.
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 https pública 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
Lo resolví agregando algunas claves en info.plist. Los pasos que seguí son:
-
info.plist
archivoinfo.plist
mi objetivo deinfo.plist
-
Se agregó una clave llamada
NSAppTransportSecurity
comoDictionary
. -
Se agregó una subclave llamada
NSAllowsArbitraryLoads
comoBoolean
y estableció su valor enYES
como en la siguiente imagen.
Limpia el proyecto y ahora todo funciona bien como antes.
Enlace de referencia: https://.com/a/32609970
EDITAR:
O En el código fuente del archivo
info.plist
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>
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:
-
Establecer
NSAllowsArbitraryLoads
en verdadero para mi extensión de reloj (no para mi aplicación de reloj). -
Asegúrese de que estaba usando
https
y nohttp
.
Paso uno:
En primer lugar, y obviamente, tuve que agregar una clave
NSAppTransportSecurity
como diccionario en la extensión
info.plist
mi reloj con una subclave llamada
NSAllowsArbitraryLoads
como un conjunto booleano como verdadero.
Solo
configúrelo 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.
o
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Segundo paso:
Luego tuve que asegurarme de que la URL que intentaba cargar era
https
y 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”];
Para aquellos de ustedes que desarrollan en localhost, sigan estos pasos:
-
Toque el botón "+" junto a
Information Property List
y agregueApp Transport Security Settings
y asígnele un Tipo deDictionary
-
Toque el botón "+" junto a la entrada de
App Transport Security Settings
recién creada y agregueNSExceptionAllowsInsecureHTTPLoads
de tipoBoolean
y establezca su valor enYES
. -
Haga clic derecho en la entrada
NSExceptionAllowsInsecureHTTPLoads
y haga clic en la opción "Shift Row Right" para que sea un elemento secundario de la entrada anterior. -
Toque el botón "+" junto a la entrada
NSExceptionAllowsInsecureHTTPLoads
y agregueAllow Arbitrary Loads
de tipoBoolean
y establezca su valor enYES
Nota: Al final, debería verse como se presenta en la siguiente imagen
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>
Solo necesita usar HTTPS y no HTTP en su URL y funcionará
Tenga en cuenta que el uso de
NSAllowsArbitraryLoads = true
en
info.plist
del proyecto permite 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:
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.
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]
necesita tener una clave
NSAllowsArbitraryLoads [Boolean]
configurada en
YES
o Meteor necesita usar
https
para su
localhost server
pronto.
Asegúrese de cambiar el archivo info.plist correcto .
Esta es la segunda vez que pierdo el tiempo en este tema, porque no me di cuenta de que estoy cambiando info.plist en MyProjectNameUITests.
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
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 se permiten 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
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: .com)
Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES