gpt4 book ai didi

iOS 拦截来 self 的应用程序的所有网络流量?

转载 作者:可可西里 更新时间:2023-11-01 03:48:39 26 4
gpt4 key购买 nike

我想为来 self 的应用程序的所有网络调用添加代理。有点像

func intercept(request: URLRequest) {
if isOk(request) {
return // the request continues as normally
} else if isIntercepted(request) {
let res = HTTPURLResponse(url: url, statusCode: 200, httpVersion: "HTTP/2", headerFields: ["Content-Type": "application/json"])
res.value = "{\"ok\":true}" // not that exactly work, but you get the idea
request.end(res)
} else {
let res = HTTPURLResponse(url: url, statusCode: 401, httpVersion: "HTTP/2")
res.value = "forbidden"
request.end(res)
}
}

我希望它应用于来 self 的应用的所有调用。即来 self 的代码以及我正在使用的所有库和框架。可能吗?

我发现了有关读取其他应用程序的流量(不可能)和设置从我的代码开始的调用的委托(delegate)的问题。我想更进一步,1) 会自动应用于所有流量,2) 包括来自第 3 方的流量

最佳答案

这是 URLProtocol 类的工作。

来自 Apple 的文档:

An NSURLProtocol object handles the loading of protocol-specific URL data. The NSURLProtocol class itself is an abstract class that provides the infrastructure for processing URLs with a specific URL scheme. You create subclasses for any custom protocols or URL schemes that your app supports.

您需要实现您自己的 URLProtocol 子类,并将其注册到应用程序以供使用。此后,从应用程序初始化的所有连接都将使用该协议(protocol),您将能够处理/阻止您想要的任何请求。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
guard URLProtocol.registerClass(MyURLProtocol.self) else
{
abort()
}

return true
}

此外,如果您正在使用 URLSession(您应该这样做!),那么您还必须通过 session 配置注册您的类:

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

但作为一个 gizmo(和我自己的练习),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}

玩得开心!

关于iOS 拦截来 self 的应用程序的所有网络流量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42125565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com