tutorial the programming language kits for apple ios xcode swift

ios - the - xcode kits



App Transport Security Xcode 7 beta 6 (5)

Actualmente estoy trabajando en Xcode 7 beta 6 . Estoy intentando enviar una solicitud de "DELETE" a http://mySubdomain.herokuapp.com

El error que recibo es:

App Transport Security ha bloqueado una carga de recursos HTTP sin cifrar (http: //) ya que es insegura. Las excepciones temporales se pueden configurar a través del archivo Info.plist de su aplicación.
Error al hacer una llamada a la API: dominio de error = NSURLErrorDomain Code = -1022 No se pudo cargar el recurso porque la política de seguridad de transporte de la aplicación requiere el uso de una conexión segura.
NSLocalizedDescription = No se pudo cargar el recurso porque la política de seguridad del transporte de aplicaciones requiere el uso de una conexión segura., NSUnderlyingError = 0x796f7ef0 {Error Domain = kCFErrorDomainCFNetwork Code = -1022 "(null)"}}

En mi llamada real a la API puse "https" en lugar de "http" y eso realmente funcionó para mis solicitudes POST. Pero la solicitud DELETE arroja el error anterior.

He visto soluciones aquí que implican el archivo pList, pero ninguno de ellos me ha funcionado. He enumerado mis intentos a continuación.

Primer intento:

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

Segundo intento:

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>herokuapp.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSRequiresCertificateTransparency</key> <false/> </dict> </dict> </dict>

Y finalmente, incluso puse todas estas claves temporales así:

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>herokuapp.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSTemporaryExceptionRequiresForwardSecrecy</key> <false/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSTemporaryThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSTemporaryThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> <key>NSRequiresCertificateTransparency</key> <false/> <key>NSTemporaryRequiresCertificateTransparency</key> <false/> </dict> </dict> </dict>

¡Todo sin suerte! Siempre recibo el mismo error. La solicitud DELETE está formateada correctamente porque cuando lo hago manualmente desde Postman, obtengo el resultado deseado.

Así es como se ve mi método real de llamada API, en caso de que pudiera haber un problema aquí:

class func makeDELETEALLRequest(completion: (error:Bool) -> Void) { let session = NSURLSession.sharedSession() let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean") let request = NSMutableURLRequest(URL: url!) request.HTTPMethod = "DELETE" let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in if (error != nil) { print("Error making API call: /(error!)") completion(error: true) } else { let HTTPResponse = response as! NSHTTPURLResponse let statusCode = HTTPResponse.statusCode if (statusCode == 200){ print("Successfully deleted!") completion(error: false) } else { print("Different status code: /(statusCode)") completion(error: true) } } } task.resume() }

Una vez más, estoy usando Xcode 7 beta 6 .

ACERCA DE MI RESPUESTA SELECCIONADA La respuesta que seleccioné como correcta fue adecuada para mí porque hice todos estos cambios en el archivo pList incorrecto en mi proyecto y esa respuesta fue la única que abordó la posibilidad. Las soluciones ofrecidas por las otras respuestas no son incorrectas, por lo que cualquier otra persona que experimente este problema debería intentarlo, ya que son válidas. Espero que esto ayude a cualquiera que tenga problemas similares.


Apreciar que ha intentado agregar lo siguiente a su archivo plist:

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

... es posible que desee intentar cambiar su línea:

let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")

a:

let url = NSURL(string:"http://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")

Disculpas si has probado esto. Puedo entender lo frustrante que es cuando piensas que has agotado todas las vías.

Pero tan pronto como ejecuté mi aplicación en Xcode 7, para poder probar nuestras aplicaciones, se inició con el problema de "Seguridad de transporte de la aplicación". Estamos utilizando servicios web basados ​​en Oracle y es demasiado tarde para comenzar a configurar certificados digitales para HTTP basado en SSL. Entonces, la adición anterior a mi archivo plist hizo el truco. Te agradezco decir que has intentado esto. Pero, solo para ayudar a alguien más, realmente funcionó para mí. Es necesario ya que no tengo forma inmediata de habilitar SSL en nuestro cuadro de Oracle.


En Xcode 8 y Xcode 9

  1. Abra mi archivo Projects info.plist
  2. Agregue una clave llamada AppTransportSecurity como diccionario.
  3. Agregue una Subclave llamada AllowsArbitraryLoads como Boolean y establezca su valor en YES como en la imagen siguiente.


Lo he resuelto como un archivo plist.
1. Agregue un NSAppTransportSecurity : Dictionary .
2. Agregue Subkey llamada NSAllowsArbitraryLoads como Boolean : YES

Esto funcionó bien.


Lo he solucionado agregando alguna clave en info.plist. Como estoy usando el objetivo C para alguna aplicación nativa.

Los pasos que seguí son:

  1. info.plist mi archivo Projects info.plist

  2. Se agregó una clave llamada NSAppTransportSecurity como Dictionary .

  3. Se agregó una Subclave llamada NSAllowsArbitraryLoads como Boolean y se establece su valor en YES como en la siguiente imagen.

Limpie el proyecto y ahora todo funciona bien como antes.

Ref Enlace:

  1. https://.com/a/32631185/2905967

  2. https://.com/a/32609970


Yo también tuve problemas para reemplazar App Transport Security después de actualizar a xCode 7.0, y probé el mismo tipo de soluciones que tiene en vano. Después de dejarlo por un tiempo, noté que había realizado los cambios en Info.plist en Archivos de soporte de "Pruebas de MyAppName" en lugar de en el proyecto mismo. La carpeta de Archivos de soporte en mi proyecto no se expandió, por lo que ni siquiera había notado el Info.plist en él.

Típico error de aficionado, estoy seguro, pero están a un par de líneas de distancia en el Navegador de proyectos y me frustró hasta que noté la distinción. Pensé que podría mencionarlo en caso de que tenga el mismo problema.