【发布时间】:2023-03-22 14:01:01
【问题描述】:
我正在尝试实现本教程,该教程使用 NSURLConnection 实现自定义 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")
}
}
【问题讨论】:
-
你怎么知道你的代码不工作?你做了什么来自己追查问题?您可以回顾一下您的代码示例并删除所有注释掉的部分吗?也许添加一些关于您在每个例程中要完成的任务的 cmets。
-
嘿,我是 swift 新手,面临 webview 缓存问题。我正在尝试使用相同的源,网页加载正确并保存在缓存中。但是当设备离线时,我无法从缓存数据中获取它。可能我必须用 urlsession 更新代码。你能帮我看看这个来源吗:(drive.google.com/file/d/0B-5GPXUpPZh-Q2FOWEJudXRaQkE/…
标签: ios swift nsurlsession nsurlprotocol nsurlsessiondatatask