如何在 Xcode 游乐场上使用 Charles Proxy?

How to use Charles Proxy on an Xcode Playground?

从 Swift 游乐场发出网络请求时,我在 Charles Proxy 中看不到网络调用。但是,当我按照答案 here.

中的步骤从 iOS 模拟器发出网络请求时,它会起作用

最好让它适用于 Xcode Playgrounds 以加快迭代速度。有谁知道需要做什么才能让它在那里工作?

与模拟器不同,Playgrounds 没有自己的网络配置。如果您需要在 Playground 上使用代理,那么您需要代理 Mac 的网络连接。这将影响您 Mac 上的每个应用程序,这可能会产生大量数据。它应该可以工作,但您可能想要退出任何其他与网络相关的应用程序。例如,如果您在测试时不需要使用浏览器,请在完成之前退出它。

我发现 gist 描述了一种使其与 Playgrounds 一起工作的方法。它避免了更改 ATS 设置的需要。使用以下实现创建符合 URLSessionDelegate 的对象:

public class NetworkEnabler: NSObject, NSURLSessionDelegate {
    public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
        completionHandler(.UseCredential, NSURLCredential(trust: challenge.protectionSpace.serverTrust!))
    }
}

并创建一个以实例作为其委托的会话:URLSession(configuration: .default, delegate: enabler, delegateQueue: nil)。使用该会话处理请求将允许您使用 Charles。

Swift 5版fruitcoder的回答:


public class NetworkEnabler: NSObject, URLSessionDelegate {
    public func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }
}

然后初始化 URLSession:

let session = URLSession(configuration: .default, delegate: NetworkEnabler(), delegateQueue: nil)