Swift 2 – Xcode 7.0 no puede acceder al sitio HTTPS con un certificate SSL sin restricciones

Expertos, soy principiante en IOS 9 / XCODE 7 / Swift 2 Development Kit

Estoy intentando crear una aplicación ios que simplemente enrute a la aplicación web en el protocolo HTTPS. A continuación se muestra mi código en ViewController.swift

 import UIKit class ViewController: UIViewController { @IBOutlet var myWebView: UIWebView! /** * Function to Display the Web Application initial URL */ func loadAppURL(){ let siteAddress = "https://domain:8443/path/to/page" let url = NSURL (string: siteAddress) let urlRequest = NSURLRequest(URL: url!) myWebView.loadRequest(urlRequest) } override func viewDidLoad() { super.viewDidLoad() loadAppURL() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

Al crear mi aplicación muestra el siguiente post de error

2015-10-01 01: 05: 13.879 Web Page Tester [2947: 31838] NSURLSession / NSURLConnection La carga HTTP falló (kCFStreamErrorDomainSSL, -9807)

y si bash build mi aplicación en lugar de " https: // domain: 8443 / path / to / page " con " http://www.apple.com " funciona bien.

Puedo acceder a mi aplicación web en Safari y me pide que acepte los riesgos de security. y lo acepto y puedo acceder a mi request.

Guíame para solucionar mis problemas, gracias de antemano.

Finalmente lo arreglé

Xcode rechazará los certificates autofirmados no confiables de los serveres de forma pnetworkingeterminada.

podemos anular esto mediante NSURLConnection y podemos comunicarnos con un server NSURLConnection , ya que tenemos la capacidad de controlar la authentication mediante los methods de delegado adicionales que no están disponibles para UIWebView. Entonces, usando la connection:didReceiveAuthenticationChallenge podemos autenticarnos contra el server connection:didReceiveAuthenticationChallenge .

Referencias NSURLAuthenticationChallenge Docs , @Lilo Lu's Question

Resolví mi problema en los siguientes pasos
Paso 1: definió una NSURLConnection en el método viewDidLoad() de mi viewController.swift de la siguiente manera

  override func viewDidLoad() { super.viewDidLoad() let siteAddress = "https://domain:8443/path/to/page" let url = NSURL (string: siteAddress) let urlRequest = NSURLRequest(URL: url!) let urlConnection:NSURLConnection = NSURLConnection(request: request, delegate: self)! myWebView.loadRequest(urlRequest) } 

Paso 2: se utilizaron los methods de delegado NSURLConnection

  func connection(connection: NSURLConnection, canAuthenticateAgainstProtectionSpace protectionSpace: NSURLProtectionSpace) -> Bool{ print("canAuthenticateAgainstProtectionSpace method Returning True") return true } func connection(connection: NSURLConnection, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge){ print("did autherntcationchallenge = \(challenge.protectionSpace.authenticationMethod)") if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { print("send cnetworkingential Server Trust") let cnetworkingential = NSURLCnetworkingential(forTrust: challenge.protectionSpace.serverTrust!) challenge.sender!.useCnetworkingential(cnetworkingential, forAuthenticationChallenge: challenge) }else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic{ print("send cnetworkingential HTTP Basic") let defaultCnetworkingentials: NSURLCnetworkingential = NSURLCnetworkingential(user: "username", password: "password", persistence:NSURLCnetworkingentialPersistence.ForSession) challenge.sender!.useCnetworkingential(defaultCnetworkingentials, forAuthenticationChallenge: challenge) }else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM{ print("send cnetworkingential NTLM") } else{ challenge.sender!.performDefaultHandlingForAuthenticationChallenge!(challenge) } } 

y eso funcionó !!

Puede agregar lo siguiente a su plist

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

introduzca la descripción de la imagen aquí

En Swift 3.

Paso 1. Agregue NSURLConnectionDelegate a su viewcontroller, para sobrescribir methods.

 class ViewController: UIViewController, NSURLConnectionDelegate { 

Paso 2. Reemplazar viewDidLoad

 override func viewDidLoad() { super.viewDidLoad() let siteAddress = "https://mysiteaddress" let url = URL(string: siteAddress) let urlRequest = URLRequest(url: url!) let urlConnection:NSURLConnection = NSURLConnection(request: urlRequest, delegate: self)! webView.loadRequest(urlRequest) } 

Paso 3 Sobrescribir canAuthenticateAgainstProtectionSpace y hacer didReceive challenge

 func connection(_ connection: NSURLConnection, canAuthenticateAgainstProtectionSpace protectionSpace: URLProtectionSpace) -> Bool { print("\ncanAuthenticateAgainstProtectionSpace method Returning True\n") return true } func connection(_ connection: NSURLConnection, didReceive challenge: URLAuthenticationChallenge) { print("did autherntcationchallenge = \(challenge.protectionSpace.authenticationMethod)") if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { print("\nsend cnetworkingential Server Trust\n") let cnetworkingential = URLCnetworkingential(trust: challenge.protectionSpace.serverTrust!) challenge.sender!.use(cnetworkingential, for: challenge) }else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic{ print("send cnetworkingential HTTP Basic") let defaultCnetworkingentials: URLCnetworkingential = URLCnetworkingential(user: "user", password: "password", persistence:URLCnetworkingential.Persistence.forSession) challenge.sender!.use(defaultCnetworkingentials, for: challenge) }else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM{ print("\nsend cnetworkingential NTLM\n") } else{ challenge.sender!.performDefaultHandling!(for: challenge) } } 

¡Gracias Navas Basheer por la solución original! Me salvó un montón de time

1- Cree la categoría "NSURLRequestCategory" -> después de importar esta categoría a su file bridge creado por xcode (no olvide dejar que xCode cree uno si no lo hizo) y coloque este código:

  @implementation NSURLRequest (NSURLRequestCategory) + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host { return YES; } @end 

Cree su request de carga UIWebView normalmente:

 webView.delegate = self let myURL = URL(string: Constants.URL_DOMAINE) let request = URLRequest(url: myURL!) webView.loadRequest(request) 

Enjoyyy: D

editar Info.plist, Agregar:

  1. Configuración de security de transporte de la aplicación
  2. Permitir cargas arbitrarias, el valor es SÍ

Es trabajo para mí, XCode 7.3