iOS9 no carga recursos inseguros desde una página segura (SSL / HTTPS)

Estoy intentando cargar una página en UIWebView en iOS9 usando https: // URL. La página cargada incluye CSS e imágenes de un servidor inseguro.

Por ejemplo, la página cargada: https : //www.example.com/ que incluye la hoja de estilo http : //www.example.com/style.css y la imagen http : //www.example.com/image.jpg

Todo funciona si la página original se carga a través de una conexión insegura (http regular). Todo funciona también en iOS8 a través de HTTPS y HTTP.

Establecí NSAppTransportSecurity a NSAllowsArbitraryLoads en el archivo PLIST de la aplicación:

NSAppTransportSecurity  NSAllowsArbitraryLoads   

Sin embargo, al cargar la página a través de HTTPS, las imágenes se cargan correctamente, pero los archivos CSS no lo son. Parece que UIWebView bloquea la carga de recursos inseguros desde una página segura.

¿Hay alguna configuración de UIWebView que permita cargar CSS a través de una conexión insegura?

Esto no está relacionado con ATS. WebKit impone una política de contenido mixto que no permite el acceso a ciertas clases de contenido “activo” (JS, CSS, etc.) para que no se carguen a través de una conexión insegura cuando la página de host se sirve sobre https.

Si examina su página en el Inspector verá que esto se informa en el panel de error.


Seguimiento: no puede desactivar el locking de contenido mixto. Permitir CSS o JS inseguros reduce la seguridad de toda la página a la del recurso menos seguro. La solución si debe cargar css / js sobre http es cargar toda la página a través de http. De esta forma, la IU vista por el usuario refleja correctamente la seguridad del contenido.

En su info.plist necesita agregar las siguientes claves de Seguridad de transporte de aplicaciones:

 NSAppTransportSecurity Dictionary NSAllowsArbitraryLoads Boolean YES NSExceptionDomains Dictionary **YOUR-DOMAIN-HERE** Dictionary NSExceptionAllowsInsecureHTTPLoads Boolean YES NSIncludesSubdomains Boolean YES NSThirdPartyExceptionAllowsInsecureHTTPLoads Boolean YES 

Espero que esto funcione para ti.

App Transport Security revisada en iOS9. Ahora en adelante su aplicación está a salvo de una conexión segura. Y iOS obliga a hacer una conexión segura. Esto puede ser un conflicto en tu caso.

De la documentación de Apple

Si su aplicación necesita realizar una solicitud a un dominio inseguro, debe especificar este dominio en el archivo Info.plist de su aplicación.

Así que creo que esto puede ser un problema al cargar el archivo .css para páginas web.

Así que intente especificar su dominio en info.plist y verifique que los archivos info.plist estén cargados o no.

Editar:


Spotlight: Necesita agregar más claves aquí en info.plist .

Mire esta clave NSThirdPartyExceptionAllowsInsecureHTTPLoads esto permite un dominio de servicio que no está controlado por el desarrollador y agrega una excepción a la capa de transporte para pasar recursos inseguros.

La estructura para agregar claves para la seguridad del transporte de aplicaciones está a continuación:

enter image description here

Para obtener más detalles y explicaciones sobre todas las claves, consulte esta nota – App Transport Security Technote

En Xcode 8.3.3 (8E3004b)

Ha cambiado a

App Transport Security Settings > Allow Arbitrary Loads in Web Content > YES

enter image description here

Utilizo la herramienta webkit pero no puedo abrir el enlace que ssl no permite (algunos enlaces https) y funciona en swift4 con este código (antes debe declarar delegado)

 override func viewDidLoad() { super.viewDidLoad() let url = URL(string: currentAttach.fileUrl!) let req = URLRequest(url:url!) self.webView!.load(req) self.webView.navigationDelegate = self } } extension ViewController: WKNavigationDelegate{ //MARK:- WKNavigationDelegate //For Allow SSL https func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!)) } func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { print(error.localizedDescription) } func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { print("Strat to load") startLoading() } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("finish to load") stopLoading() } }