Використання проксі в Swift
Проксі в Swift
Swift — це основна мова для розробки додатків для iOS та macOS. Робота з проксі в Swift здійснюється через URLSession (високорівневий API), фреймворк Network (низькорівневий) та системні налаштування.
URLSession з проксі
Конфігурація через URLSessionConfiguration
import Foundation
let config = URLSessionConfiguration.default
// Конфігурація HTTP проксі
config.connectionProxyDictionary = [
kCFNetworkProxiesHTTPEnable: true,
kCFNetworkProxiesHTTPProxy: "proxy_ip",
kCFNetworkProxiesHTTPPort: 8080,
kCFNetworkProxiesHTTPSEnable: true,
kCFNetworkProxiesHTTPSProxy: "proxy_ip",
kCFNetworkProxiesHTTPSPort: 8080
]
let session = URLSession(configuration: config)
let url = URL(string: "https://httpbin.org/ip")!
let task = session.dataTask(with: url) { data, response, error in
if let data = data, let body = String(data: data, encoding: .utf8) {
print(body)
}
}
task.resume()
SOCKS Проксі
config.connectionProxyDictionary = [
kCFStreamPropertySOCKSProxyHost: "proxy_ip",
kCFStreamPropertySOCKSProxyPort: 1080,
kCFStreamPropertySOCKSVersion: kCFStreamSocketSOCKSVersion5
]
З автентифікацією
config.connectionProxyDictionary = [
kCFNetworkProxiesHTTPEnable: true,
kCFNetworkProxiesHTTPProxy: "proxy_ip",
kCFNetworkProxiesHTTPPort: 8080,
kCFProxyUsernameKey: "username",
kCFProxyPasswordKey: "password"
]
Системні налаштування проксі
Автоматичне використання
За замовчуванням URLSession використовує системні проксі:
let config = URLSessionConfiguration.default
// Використовує системні проксі за замовчуванням
let session = URLSession(configuration: config)
Якщо користувач налаштував проксі в системних налаштуваннях iOS/macOS, URLSession автоматично використовуватиме їх.
PAC Файл
config.connectionProxyDictionary = [
kCFNetworkProxiesProxyAutoConfigEnable: true,
kCFNetworkProxiesProxyAutoConfigURLString: "http://example.com/proxy.pac"
]
Обробка запиту на автентифікацію проксі
Коли проксі вимагає автентифікації, URLSession викликає свого делегата:
class ProxyDelegate: NSObject, URLSessionDelegate {
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
) {
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic
&& challenge.protectionSpace.isProxy {
let credential = URLCredential(
user: "username",
password: "password",
persistence: .forSession
)
completionHandler(.useCredential, credential)
} else {
completionHandler(.performDefaultHandling, nil)
}
}
}
let delegate = ProxyDelegate()
let session = URLSession(configuration: config, delegate: delegate, delegateQueue: nil)
Фреймворк Network (NWConnection)
Для низькорівневих мережевих операцій в iOS 12+ / macOS 10.14+:
import Network
let proxyConfig = NWProtocolTLS.Options()
let params = NWParameters.tls
// Конфігурація проксі через NWEndpoint
let proxyEndpoint = NWEndpoint.hostPort(
host: NWEndpoint.Host("proxy_ip"),
port: NWEndpoint.Port(rawValue: 8080)!
)
// Створення з'єднання
let connection = NWConnection(
host: "httpbin.org",
port: 443,
using: params
)
connection.stateUpdateHandler = { state in
switch state {
case .ready:
print("Connected")
case .failed(let error):
print("Failed: \(error)")
default:
break
}
}
connection.start(queue: .global())
Alamofire з проксі
Alamofire — це популярна Swift HTTP бібліотека:
import Alamofire
let config = URLSessionConfiguration.default
config.connectionProxyDictionary = [
kCFNetworkProxiesHTTPEnable: true,
kCFNetworkProxiesHTTPProxy: "proxy_ip",
kCFNetworkProxiesHTTPPort: 8080
]
let session = Session(configuration: config)
session.request("https://httpbin.org/ip").response { response in
if let data = response.data, let body = String(data: data, encoding: .utf8) {
print(body)
}
}
Особливості iOS
VPN та проксі в iOS
iOS дозволяє конфігурувати проксі через:
1. Системні налаштування (Налаштування → Wi-Fi → HTTP Проксі)
2. MDM профілі
3. NEProxySettings (фреймворк Network Extension)
Network Extension
Щоб створити повноцінний проксі-додаток на iOS, використовуйте NETransparentProxyProvider:
import NetworkExtension
class ProxyProvider: NETransparentProxyProvider {
override func startProxy(options: [String: Any]?, completionHandler: @escaping (Error?) -> Void) {
// Конфігурація проксі
completionHandler(nil)
}
override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool {
// Обробка нового з'єднання
return true
}
}
Це вимагає дозволу від Apple і підходить для рішень Enterprise/MDM.
async/await (Swift 5.5+)
func fetchViaProxy() async throws -> String {
let config = URLSessionConfiguration.default
config.connectionProxyDictionary = [
kCFNetworkProxiesHTTPEnable: true,
kCFNetworkProxiesHTTPProxy: "proxy_ip",
kCFNetworkProxiesHTTPPort: 8080
]
let session = URLSession(configuration: config)
let url = URL(string: "https://httpbin.org/ip")!
let (data, _) = try await session.data(from: url)
return String(data: data, encoding: .utf8) ?? ""
}
// Використання
Task {
let ip = try await fetchViaProxy()
print(ip)
}
Висновок
Swift надає гнучкі інструменти для роботи з проксі: URLSession для високорівневих завдань, фреймворк Network для низькорівневого контролю та Network Extension для створення проксі-додатків. Для більшості завдань URLSession з connectionProxyDictionary є оптимальним вибором.