这是 URLProtocol 类的工作。
来自 Apple 的文档:
NSURLProtocol 对象处理特定协议 URL 的加载
数据。 NSURLProtocol 类本身是一个抽象类
提供用于处理具有特定 URL 的 URL 的基础结构
方案。您为任何自定义协议或 URL 方案创建子类
您的应用支持。
您需要实现自己的URLProtocol 子类并将其注册到应用程序以供使用。此后,从应用程序初始化的所有连接都将使用该协议,您将能够处理/阻止您想要的任何请求。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
guard URLProtocol.registerClass(MyURLProtocol.self) else
{
abort()
}
return true
}
此外,如果您使用的是URLSession(并且应该!),那么您还必须通过会话配置注册您的课程:
func getURLSessionConfiguration() -> URLSessionConfiguration
{
let configuration = URLSessionConfiguration.default
configuration.protocolClasses = [
MyURLProtocol.self
]
return configuration
}
let session = URLSession(configuration: getURLSessionConfiguration())
然后,您可以通过 URLProtocol 子类的 startLoading() 方法管理您想要阻止的任何内容:
override func startLoading()
{
if !self.isOK()
{
let error = NSError(domain: "GuardURLProtocol", code: 10, userInfo: [NSLocalizedDescriptionKey: "Connection denied by guard"])
self.client?.urlProtocol(self, didFailWithError: error)
}
else if let task = self.task
{
task.resume()
}
}
还有更多的方法你必须实现,你应该阅读documentation from Apple。
但作为一个小发明(并为我自己练习),I have written a generic blocker protocol,你应该检查一下它是如何工作的。在GuardURLProtocol.swift 文件的底部有一个示例子类 (BlockFPTURLSession),其中所有 FTP 请求都被架构阻止。
如果您使用我上面链接的类,并尝试打开 FTP 连接,您将看到以下错误:
2017-02-16 23:09:45.846 URLProtocol[83111:7456862] Error: Error Domain=GuardURLProtocol Code=10 "Connection denied by guard" UserInfo={NSLocalizedDescription=Connection denied by guard}
玩得开心!