我想實現這個教程,它實現NSURLConnection的自定義NSURLProtocol。與NSURLSession自定義NSURLProtocol
https://www.raywenderlich.com/76735/using-nsurlprotocol-swift
它能正常工作,但現在NSURLConnection的是iOS9過時,我試圖將其轉換爲NSURLSession。
不幸的是它沒有工作。
我正在uiwebview中加載一個網站,如果我使用它加載的NSURLConnection,並且所有事情都按預期工作,則捕獲所有來自webview的http請求,但不會在使用NSURLSession時捕獲。
任何幫助表示讚賞。
這裏是我的代碼
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")
}
}
你怎麼知道你的代碼是不工作?你已經做了什麼來自己追查這個問題?你可以回顧一下你的代碼示例,並刪除所有註釋掉的部分?也許在每個例程中添加一些關於你想要完成的評論。 –
嘿,我是新的迅速和麪臨webview緩存問題。我正在嘗試使用相同的源代碼,網頁加載正確並保存在緩存中。但是當設備脫機時,我無法從緩存數據中獲取它。可能是我必須更新與urlsession的代碼。您可以請幫助我與這個來源請:(:(https://drive.google.com/file/d/0B-5GPXUpPZh-Q2FOWEJudXRaQkE/view?usp=sharing –