ProxyResolver 允许从用户系统配置中简单地解析实际的代理信息,并且可以用于设置基于流的连接,例如用于 WebSockets。
使用示例
import ProxyResolver
let proxy = ProxyResolver()
let url = URL(string: "https://github.com")!
proxy.resolve(for: url) { result in
switch result {
case .direct:
// Direct connection allowed - no proxy required
break
case .proxy(let proxy):
// here you can establish connection to proxy or whatever you want
// proxy.type - one of ProxyType enum: .http, .https or .socks
// proxy.host - host name of proxy to use
// proxy.port - port number
break
case .error(let error):
// Handle error
break
}
}
* 由于 ATS 保护,自动配置 URL 应该是 HTTPS 或具有 *.local 或无法全局解析的域名,否则您需要在 plist 中设置 NSAllowsLocalNetworking
键。 更多信息可以在 NSAppTransportSecurity 参考 中找到。
Proxy.credentials
将自动访问 Proxy
钥匙串以检索为代理帐户和密码配置的信息。 由于这需要用户许可,因此凭据仅在您尝试获取它们时才会被延迟检索。
您可以使用自定义代理配置提供程序而不是系统提供程序,或者提供您自己的获取器来下载自动配置脚本,而不是基于 NSURLSession 的默认获取器。
“一般来说,您应该尝试使用数组中的第一个代理下载 URL,如果第一个代理失败,则尝试第二个代理,依此类推。” - 如 CFNetworkCopyProxiesForURL 方法的文档中所述。
使用 ProxyResolverDelegate
,您可以尝试连接到已解析的代理,并且在出现任何问题或者您只是想检索所有代理的情况下 - 如果仍有任何代理配置可用,则继续解析。
class CustomDelegate: ProxyResolverDelegate {
func proxyResolver(_ proxyResolver: ProxyResolver, didResolve result: ProxyResolutionResult, for url: URL, resolveNext: ResolveNextRoutine?) {
switch result {
case .direct:
// no proxy required - try to connect to your 'url' directly
break
case .proxy(let proxy):
// try connect to your 'url' using resolved 'proxy'
yourConnectMethod(to: url, using: proxy) { (response, error) in
if let error = error {
// If connection failed we will try to resolve next proxy if
// available and retry connection
resolveNext?()
}
}
case .error(let error):
// handle error
break
}
}
待定
要安装它,请将以下行添加到 Podfile
pod 'ProxyResolver'
例如
use_frameworks!
target 'TestPackagesForProxyResolver' do
platform :osx, '10.12'
pod 'ProxyResolver'
end
要安装它,请将以下行添加到 Cartfile
GitHub "rinold/ProxyResolver"
要安装它,请将以下软件包添加到需要的 Packages.swift
依赖项中
.package(url: "https://github.com/rinold/ProxyResolver.git", from: "0.3.0")
例如
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "TestPackagesForProxyResolver",
products: [
.executable(name: "TestPackagesForProxyResolver", targets: ["TestPackagesForProxyResolver"]),
],
dependencies: [
.package(url: "https://github.com/rinold/ProxyResolver.git", from: "0.3.0"),
],
targets: [
.target(
name: "TestPackagesForProxyResolver",
dependencies: ["ProxyResolver.git"]),
]
)
我们使用 SemVer 进行版本控制。 有关可用版本,请参阅此仓库上的 标签。
ProxyResolver 最初的灵感来自于 web sockets Starscream 代理支持 PR。
Mikhail Churbanov, mihail.churbanov@gmail.com
ProxyResolver 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。