Implementación pnetworkingeterminada del método de protocolo con extensión Swift

Estoy intentando escribir un comportamiento pnetworkingeterminado para un método de delegado usando una extensión Swift como se muestra a continuación, pero nunca se llama. ¿Alguien sabe por qué o cómo hacerlo de la manera correcta?

extension NSURLSessionDelegate { public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCnetworkingential?) -> Void) { //default behaviour here } } 

Agregar override tampoco funciona.

Según esto , la implementación pnetworkingeterminada de Apple parece:

 extension NSURLSessionDelegate { func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) { } func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCnetworkingential?) -> Void) { } } 

Mis llamadas DataTask suelen verse así:

 let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() sessionConfiguration.HTTPCookieStorage = NSHTTPCookieStorage.shanetworkingHTTPCookieStorage() let session = NSURLSession(configuration: sessionConfiguration) let requestURL = NSURL(string:"https:www.google.com/blabla") session.dataTaskWithURL(requestURL!, completionHandler: completion).resume() 

Donde la completion será típicamente un cierre Swift recibido a través de un parámetro.

Necesito implementar la function URLSession(... didReceiveChallenge ...) para todas nsurlsessiontask implementaciones de nsurlsessiontask toda mi aplicación, pero no puedo configurar el delegado de mi session ya que necesito usar completionHandler (como se menciona en mi comentario a continuación).

Puede extender el protocolo NSURLSessionDelegate para agregar la implementación pnetworkingeterminada, pero sus objects NSURLSession necesitan un delegado.

Este delegado solo puede configurarse utilizando +sessionWithConfiguration:delegate:delegateQueue: (dado que la propiedad de delegado es de solo lectura ), entonces su única forma de configurarlo es a la subclass NSURLSession , anular +sessionWithConfiguration: y llamar al inicializador con la propiedad de delegado. El problema aquí es que debe replace todos sus objects MyCustomSessionClass a MyCustomSessionClass . objects.

Sugiero que cree una class SessionCreator que se ajuste al protocolo NSURLSessionDelegate y que cree objects NSURLSession . Todavía debe replace la creación de sus objects, pero al less el object no es el delegado de sí mismo.

 public class SessionCreator:NSObject,NSURLSessionDelegate { //MARK: - Singleton method class var shanetworkingInstance :SessionCreator { struct Singleton { static let instance = SessionCreator() } return Singleton.instance } //MARK: - Public class method public class func createSessionWithConfiguration (configuration:NSURLSessionConfiguration) -> NSURLSession { return shanetworkingInstance.createSessionWithConfiguration(configuration) } //MARK: - Private methods private func createSessionWithConfiguration (configuration:NSURLSessionConfiguration) -> NSURLSession { return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil) } //MARK: - NSURLSessionDelegate protocol conformance public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCnetworkingential?) -> Void) { // Always called since it's the delegate of all NSURLSession created using createSessionWithConfiguration } } // Let create a NSURLSession object : let session = SessionCreator.createSessionWithConfiguration(NSURLSessionConfiguration())