I am trying to implement this tutorial that implements a custom NSURLProtocol with NSURLConnection.
https://www.raywenderlich.com/76735/using-nsurlprotocol-swift
It works as expected, but now that NSURLConnection is deprecated in iOS9, I am trying to convert it to NSURLSession.
Unfortunately, this did not work.
I load the site in uiwebview, if I use NSURLConnection, it loads, and everything works as expected, all HTTP requests from webview are captured, but not when using NSURLSession.
Any help is appreciated.
here is my code
import UIKit class MyProtocol: NSURLProtocol, NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDelegate { //var connection: NSURLConnection! var mutableData: NSMutableData! var response: NSURLResponse! var dataSession: NSURLSessionDataTask! override class func canInitWithRequest(request: NSURLRequest) -> Bool { if NSURLProtocol.propertyForKey("MyURLProtocolHandledKey", inRequest: request) != nil { return false } return true } override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest { return request } override class func requestIsCacheEquivalent(aRequest: NSURLRequest, toRequest bRequest: NSURLRequest) -> Bool { return super.requestIsCacheEquivalent(aRequest, toRequest:bRequest) } override func startLoading() { let newRequest = self.request.mutableCopy() as! NSMutableURLRequest NSURLProtocol.setProperty(true, forKey: "MyURLProtocolHandledKey", inRequest: newRequest) self.dataSession = NSURLSession.sharedSession().dataTaskWithRequest(newRequest) dataSession.resume() self.mutableData = NSMutableData() } override func stopLoading() { print("Data task stop") self.dataSession.cancel() self.mutableData = nil } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) { self.response = response self.mutableData = NSMutableData() print(mutableData) } func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { self.client?.URLProtocol(self, didLoadData: data) self.mutableData.appendData(data) } func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { if (error == nil) { self.client!.URLProtocolDidFinishLoading(self) self.saveCachedResponse() } else { self.client?.URLProtocol(self, didFailWithError: error!) } } func saveCachedResponse () { let timeStamp = NSDate() let urlString = self.request.URL?.absoluteString let dataString = NSString(data: self.mutableData, encoding: NSUTF8StringEncoding) as NSString? print("TiemStamp:\(timeStamp)\nURL: \(urlString)\n\nDATA:\(dataString)\n\n") } }
source share