Utilizando NSURLConnection con un certificate SSL válido en Swift

Soy relativamente nuevo en el desarrollo de IOS. ¡Entonces, por favor, compórtame y perdona cualquier cosa!

Estoy intentando recuperar datos de un service web SOAP utilizando NSURLConnection, y está funcionando bien.

Sin embargo, tan pronto como cambio la URL de http a https, ya no recupero ningún dato y no recibo un error ni nada como esperaba.

El certificate https es un certificate válido de godaddy y se configura correctamente y visualiza correctamente en todos los browseres, etc. bien, así que, básicamente, ¿alguien puede señalarme en la dirección correcta de por qué no pasa nada al cambiar de http a https …

El código está en Swift y es el siguiente:

// Create the SOAP Message to send var soapMessage = "<?xml version='1.0' encoding='UTF-8'?><SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ns1='http://tempuri.org/'><SOAP-ENV:Body><ns1:get_Test/></SOAP-ENV:Body></SOAP-ENV:Envelope>" NSLog("soapMessage generated is: %@", soapMessage) // Soap URL Works var urlString = "http://api.domain.com/testservice.svc" //Below https URL does not work //var urlString = "https://api.domain.com/testservice.svc" var url = NSURL(string: urlString) var theRequest = NSMutableURLRequest(URL: url!) //Get Length of request var msgLength = String(countElements(soapMessage)) // POST Header values theRequest.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") theRequest.addValue(msgLength, forHTTPHeaderField: "Content-Length") theRequest.addValue("http://tempuri.org/IService/get_Test", forHTTPHeaderField: "SoapAction") theRequest.HTTPMethod = "POST" theRequest.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) NSLog("Request is: %@", theRequest.allHTTPHeaderFields!) var connection = NSURLConnection(request: theRequest, delegate: self, startImmediately: true) connection?.start() if (connection == true) { var mutableData : Void = NSMutableData.initialize() } 

El código de NSURLConnection adicional es:

 // NSURLConnectionDelegate func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { mutableData.length = 0; } func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { mutableData.appendData(data) } func connection(connection: NSURLConnection, didFailWithError error: NSError) { NSLog("Error with Soap call: %@", error) } func connectionDidFinishLoading(connection: NSURLConnection!) { var xmlParser = NSXMLParser(data: mutableData) xmlParser.delegate = self xmlParser.parse() xmlParser.shouldResolveExternalEntities = true } // NSURLConnectionDelegate 

Luego tengo mi material de análisis, como didStartElement, didEndElement, foundCharacters, parserDidEndDocument, etc.

También agregué algunos delegates adicionales de NSURLConnection como a continuación, pero nada ha cambiado. Se les está llamando a medida que avanza el logging.

  func connection(connection: NSURLConnection, canAuthenticateAgainstProtectionSpace protectionSpace: NSURLProtectionSpace?) -> Bool { NSLog("am here") return protectionSpace?.authenticationMethod == NSURLAuthenticationMethodServerTrust } func connection(connection: NSURLConnection, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge?) { NSLog("am here 2") if challenge?.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { if challenge?.protectionSpace.host == "api.domain.com" { NSLog("yep") let cnetworkingentials = NSURLCnetworkingential(forTrust: challenge!.protectionSpace.serverTrust) challenge!.sender.useCnetworkingential(cnetworkingentials, forAuthenticationChallenge: challenge!) } } challenge?.sender.continueWithoutCnetworkingentialForAuthenticationChallenge(challenge!) } 

se ejecuta a través del código llega al "sí" y, por lo que entiendo, debe confiar en el certificate, pero aún no aparece nada cuando uso la URL de https.

Entonces, no hay diferencia entre ninguno de los códigos aparte de https, y el certificate es válido, ¿cómo puedo recuperar los datos usando https en lugar de http?

Muchas gracias, y lo siento si esta es una pregunta tonta.

Dave

Adicional:

ok, he cambiado la connection ahora para:

  var connection = NSURLConnection(request: theRequest, delegate: self, startImmediately: false) connection?.start() if (connection == true) { var mutableData : Void = NSMutableData.initialize() } else { NSLog("Error with connection, details: %@", connection!) } 

¡Así que ahora registra "Error con connection" cuando lo ejecuto con SSL!

Entonces, he cambiado didreceiveresponse a:

 func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { mutableData.length = 0; var httpresponse = response as? NSHTTPURLResponse println("status \(httpresponse?.statusCode)") println("headers \(httpresponse?.allHeaderFields)") } 

y veo que el statuscode de return es un 404, que simplemente no comprendo, ya que el service web está claramente allí y se puede analizar utilizando analizadores en línea.

Todavía está atascado, pero al less señala el problema. ¿Alguien tiene alguna idea para ayudarme más?

Si alguien más se queda atrapado en esto, entonces la configuration web para el service web de SVC se cambió a:

  <bindings> <basicHttpBinding> <binding> <security mode="Transport"> <transport clientCnetworkingentialType="None"/> </security> </binding> </basicHttpBinding> </bindings> <services> <service name="Service.Service"> <endpoint address="" binding="basicHttpBinding" contract="Service.IService" /> </service> </services> 

¡Esto lo arregló, por lo que el código Swift anterior ahora funciona bien! ¡Feo, eso fue duro!