Swift'te Proxy Kullanımı
Swift'te Proxy'ler
Swift, iOS ve macOS uygulamaları geliştirmek için kullanılan başlıca dildir. Swift'te proxy'lerle çalışmak URLSession (üst düzey API), Network framework'ü (alt düzey) ve sistem ayarları üzerinden yapılır.
Proxy ile URLSession
URLSessionConfiguration ile yapılandırma
import Foundation
let config = URLSessionConfiguration.default
// HTTP proxy yapılandırması
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 Proxy
config.connectionProxyDictionary = [
kCFStreamPropertySOCKSProxyHost: "proxy_ip",
kCFStreamPropertySOCKSProxyPort: 1080,
kCFStreamPropertySOCKSVersion: kCFStreamSocketSOCKSVersion5
]
Kimlik Doğrulamalı
config.connectionProxyDictionary = [
kCFNetworkProxiesHTTPEnable: true,
kCFNetworkProxiesHTTPProxy: "proxy_ip",
kCFNetworkProxiesHTTPPort: 8080,
kCFProxyUsernameKey: "username",
kCFProxyPasswordKey: "password"
]
Sistem Proxy Ayarları
Otomatik Kullanım
URLSession varsayılan olarak sistem proxy'lerini kullanır:
let config = URLSessionConfiguration.default
// Varsayılan olarak sistem proxy'lerini kullanır
let session = URLSession(configuration: config)
Kullanıcı iOS/macOS sistem ayarlarında proxy yapılandırmışsa, URLSession bunları otomatik olarak kullanır.
PAC Dosyası
config.connectionProxyDictionary = [
kCFNetworkProxiesProxyAutoConfigEnable: true,
kCFNetworkProxiesProxyAutoConfigURLString: "http://example.com/proxy.pac"
]
Proxy Kimlik Doğrulama Challenge'ını Ele Alma
Proxy kimlik doğrulama istediğinde URLSession kendi delegate'ini çağırır:
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 Framework (NWConnection)
iOS 12+ / macOS 10.14+ üzerinde alt düzey ağ işlemleri için:
import Network
let proxyConfig = NWProtocolTLS.Options()
let params = NWParameters.tls
// NWEndpoint üzerinden proxy yapılandırması
let proxyEndpoint = NWEndpoint.hostPort(
host: NWEndpoint.Host("proxy_ip"),
port: NWEndpoint.Port(rawValue: 8080)!
)
// Bağlantı oluşturma
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())
Proxy ile Alamofire
Alamofire, popüler bir Swift HTTP kütüphanesidir:
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'a Özgü Noktalar
iOS'ta VPN ve Proxy'ler
iOS, proxy yapılandırmasına şu yollarla izin verir:
1. Sistem Ayarları (Ayarlar → Wi-Fi → HTTP Proxy)
2. MDM profilleri
3. NEProxySettings (Network Extension framework'ü)
Network Extension
iOS'ta tam kapsamlı bir proxy uygulaması oluşturmak için NETransparentProxyProvider kullanın:
import NetworkExtension
class ProxyProvider: NETransparentProxyProvider {
override func startProxy(options: [String: Any]?, completionHandler: @escaping (Error?) -> Void) {
// Proxy yapılandırması
completionHandler(nil)
}
override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool {
// Yeni bir bağlantının işlenmesi
return true
}
}
Bu, Apple'dan bir entitlement gerektirir ve Enterprise/MDM çözümleri için uygundur.
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) ?? ""
}
// Kullanım
Task {
let ip = try await fetchViaProxy()
print(ip)
}
Sonuç
Swift, proxy'lerle çalışmak için esnek araçlar sunar: üst düzey görevler için URLSession, alt düzey denetim için Network framework'ü ve proxy uygulamaları oluşturmak için Network Extension. Çoğu görev için connectionProxyDictionary ile URLSession en uygun seçimdir.
