open class URLProtocol : NSObject {
public init(request: URLRequest, cachedResponse: CachedURLResponse?, client: URLProtocolClient?)
// 操作被拦截协议的对象,用于给予被拦截者回调。
open var client: URLProtocolClient? { get }
// 拦截到的request
open var request: URLRequest { get }
// 给接收者一个缓存对象
@NSCopying open var cachedResponse: CachedURLResponse? { get }
// 通过URLRequest参数返回是否要拦截这个Request
open class func canInit(with request: URLRequest) -> Bool
// 是不是要重新返回一个新的request,一般你可以在原request基础上,加一些参数等,然后再返回,返回后,request属性就是你返回的request了。
open class func canonicalRequest(for request: URLRequest) -> URLRequest
// 比较两个URLRequest的缓存是否相当,如果相当,返回true,否则返回false。 目前还没想到有什么场景需要重写这个方法。
open class func requestIsCacheEquivalent(_ a: URLRequest, to b: URLRequest) -> Bool
// 开始你需求的操作了,可以通过self.request拿到拦截的request。
open func startLoading()
// 取消任务后,你要的动作。
open func stopLoading()
// 读取URLRequest的附加属性,通过Key
open class func property(forKey key: String, in request: URLRequest) -> Any?
// 设置URLRequest的附加属性,通过Key
open class func setProperty(_ value: Any, forKey key: String, in request: NSMutableURLRequest)
// 移除URLRequest的附加属性,通过Key
open class func removeProperty(forKey key: String, in request: NSMutableURLRequest)
// 将当前协议注册进拦截系统
open class func registerClass(_ protocolClass: AnyClass) -> Bool
// 取消注册 和 registerClass 动作相反
open class func unregisterClass(_ protocolClass: AnyClass)
}
extension URLProtocol {
@available(iOS 8.0, *)
// 是否要拦截这个URLSessionTask,它和 canInit(with request: URLRequest) 只能有一个被调用,如果声明了 canInit(with task: URLSessionTask) 就不会走 canInit(with request: URLRequest) 了。
open class func canInit(with task: URLSessionTask) -> Bool
@available(iOS 8.0, *)
public convenience init(task: URLSessionTask, cachedResponse: CachedURLResponse?, client: URLProtocolClient?)
@available(iOS 8.0, *)
// 获取拦截的task
@NSCopying open var task: URLSessionTask? { get }
}