cordova-plugin-whitelist que trabaja en Android pero no iOS (Phonegap Build)

Estoy trabajando en una aplicación JavaScript envuelta en cordova y construida con Phonegap Build. Estamos incluyendo cordova-plugin-whitelist whitelist de npm en nuestra compilation y hemos agregado <access origin="*" /> a nuestro config.xml y un CSP abierto ( <meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"> ) en nuestro index.html. La aplicación funciona bien en Android y habla con nuestro server sin problemas, pero en iOS todas las requestes fallan inmediatamente, como si el complemento de la list blanca no dejara pasar el tráfico.

Probé varias configuraciones de compilation diferentes en caso de que algo se rompiera en una versión particular de cordova, pero no pude lograr que esto funcione en absoluto. Tuve un problema similar con otras aplicaciones de Phonegap / Cordova en el pasado, pero pude resolverlo con la regla de plugin / CSP / access de whitelist.

Este problema también ha sido difícil de depurar ya que Safari Developer Tools no se conectará al dispositivo iOS y tendré que alertar las respuestas que estoy viendo. Parece que la respuesta que vuelve tiene un código de estado 0 y un cuerpo vacío, que supongo que significa inalcanzable.

Es posible que necesite configurar connect-src en su Content-Security-Policy, por ejemplo:

 <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src http://YOUR_HOST"> 

Además, para Xcode 7 / iOS 9 necesitará ajustar la configuration ATS para permitir conexiones a backends no https si no está utilizando SSL:

Aquí hay un ejemplo práctico del cambio en la información de su aplicación .plist:

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

(Tenga en count que también puede configurar esto para permitir selectivamente conexiones no https).

Y aquí hay un script que podría usar como gancho de compilation previa para que iOS lo haga automáticamente:

 #!/bin/bash echo "Adjusting plist for App Transport Security exception." val=$(/usr/libexec/plistbuddy -c "add NSAppTransportSecurity:NSAllowsArbitraryLoads bool true" platforms/ios/PROJECTNAME/PROJECTNAME-Info.plist 2>/dev/null) echo "Done" 

Simplemente cambie PROJECTNAME por el nombre de su proyecto.