6

I have a NSURLSession that runs in a background queue. I'm adding my NSURLProtocol subclass to the NSURLsessionConfiguration.protocolClases but the override class func canInitWithRequest(request: NSURLRequest) -> Bool never gets called.

This is how I'm adding my NSURLProtocol

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses!.append(MockNetwork)
urlSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: operationQueue)

Also I tried with the session not running on background doing but also didn't work:

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses!.append(MockNetwork)
urlSession = NSURLSession(configuration: configuration)

As this was not working I just tried:

urlSession = NSURLSession.sharedSession()

And calling this in my AppDelegate

NSURLProtocol.registerClass(MockNetwork)

This does work, what am I doing wrong?!

Andres
  • 11,439
  • 12
  • 48
  • 87

1 Answers1

10

After spending some more hours trying to find out why this wasn't working I found the way of doing it.

Instead of:

configuration.protocolClasses?.append(MockNetwork.self)

Do:

var protocolClasses = [AnyClass]()
protocolClasses.append(MockNetwork.self)

let configuration = URLSessionConfiguration.default
configuration.protocolClasses = protocolClasses

After that change everything worked and not necessary to URLProtocol.registerClass(MockNetwork.self)

Antoine
  • 23,526
  • 11
  • 88
  • 94
Andres
  • 11,439
  • 12
  • 48
  • 87
  • You would still have to register your custom protocol through NSURLProtocol.registerClass(MockNetwork) in case you were trying to intercept web view requests. – iOSAddicted Mar 02 '16 at 03:35
  • protocolClasses uses `AnyClass` not `AnyObject`. Your array would need to be `[AnyClass]()` instead. – ecnepsnai Jul 21 '16 at 17:26