2017-03-06 22 views
13

Bir API isteği için bir Proxy kullanarak bir URLSession kurmaya çalışıyorum. Test amaçlı bir genel Proxy ve IP'ye yanıt veren bir API kullanıyorum. tarafından çağrılırYalnızca Proxy ile URLSession nasıl kullanılır 3

func makeRequestViaUrlSessionProxy(_ url: String, completion: @escaping (_ result: String?) ->()) { 

    let request = URLRequest(url: URL(string: url)!) 

    let config = URLSessionConfiguration.default 
    config.requestCachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData 
    config.connectionProxyDictionary = [AnyHashable: Any]() 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPEnable as String] = 1 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPProxy as String] = "142.54.173.19" 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] = 8888 

    let session = URLSession.init(configuration: config, delegate: nil, delegateQueue: OperationQueue.current) 

    let task = session.dataTask(with: request) { 
     (data: Data?, response: URLResponse?, error: Error?) in 
     if error != nil { 
      NSLog("Client-side error in request to \(url): \(error)") 
      completion(nil) 
      return 
     } 

     if data == nil { 
      NSLog("Data from request to \(url) is nil") 
      completion(nil) 
      return 
     } 

     let httpResponse = response as? HTTPURLResponse 
     if httpResponse?.statusCode != 200 { 
      NSLog("Server-side error in request to \(url): \(httpResponse)") 
      completion(nil) 
      return 
     } 

     let encodingName = response?.textEncodingName != nil ? response?.textEncodingName : "utf-8" 
     let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString!)) 
     let stringData = String(data: data!, encoding: String.Encoding(rawValue: UInt(encoding))) 
     session.invalidateAndCancel() 
     completion(stringData) 
    } 
    task.resume() 
} 

: bile proxy IP yapılmış çünkü

override func viewDidLoad() { 
    super.viewDidLoad() 
    makeRequestViaUrlSessionProxy("https://api.ipify.org?format=json") { string in 
     print(string) 
    } 
} 

O config gibi görünüyor tamamen göz ardı edilir, cevap IP daima

Herhangi bir yardım son derece olduğu gerçek cihazlar IP takdir.

Düzenleme: Kullanıcı tarafından önerildiği gibi hasan83, "HTTPS anahtarlarını" alarak bir seçenek gibi görünmüyor.

enter image description here enter image description here

+0

merhaba 142.54.173.19 bu ip hangi ip adresi, yönlendirici veya başka bir verebilir. ? –

cevap

7

(gerekiyordu ama, burada tuşların iki defferent seti vardır kullanımdan kaldırılacak) anahtarlar:

kCFStreamPropertyHTTPSProxyHost 
kCFStreamPropertyHTTPSProxyPort 

Bu kodu deneyebilir misiniz?

func makeRequestViaUrlSessionProxy(_ url: String, completion: @escaping (_ result: String?) ->()) { 

    let request = URLRequest(url: URL(string: url)!) 

    let config = URLSessionConfiguration.default 
    config.requestCachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData 
    config.connectionProxyDictionary = [AnyHashable: Any]() 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPEnable as String] = 1 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPProxy as String] = "142.54.173.19" 
    config.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] = 8888 
    config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyHost as String] = "142.54.173.19" 
    config.connectionProxyDictionary?[kCFStreamPropertyHTTPSProxyPort as String] = 8888 

    let session = URLSession.init(configuration: config, delegate: nil, delegateQueue: OperationQueue.current) 

    let task = session.dataTask(with: request) { 
     (data: Data?, response: URLResponse?, error: Error?) in 
     if error != nil { 
      NSLog("Client-side error in request to \(url): \(error)") 
      completion(nil) 
      return 
     } 

     if data == nil { 
      NSLog("Data from request to \(url) is nil") 
      completion(nil) 
      return 
     } 

     let httpResponse = response as? HTTPURLResponse 
     if httpResponse?.statusCode != 200 { 
      NSLog("Server-side error in request to \(url): \(httpResponse)") 
      completion(nil) 
      return 
     } 

     let encodingName = response?.textEncodingName != nil ? response?.textEncodingName : "utf-8" 
     let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString!)) 
     let stringData = String(data: data!, encoding: String.Encoding(rawValue: UInt(encoding))) 
     session.invalidateAndCancel() 
     completion(stringData) 
    } 
    task.resume() 
} 

Ayrıca proxy sunucusu https isteklerini işleyebilir yapılandırıldığından emin olun.

Not: Bu tuşların ama tuşlar için deprecated uyarı hala çalışıyoruz (https://forums.developer.apple.com/thread/19356#131446 bakınız)

+0

eklenmiş ekranlar işe yarar. yarın daha fazla test olacak, ama bu öyle görünüyor. Şu anki araştırmalarımda olduğu gibi –

+0

, yapılandırmanız da burada çalışmalıdır, bu yüzden lütfen burada denemekten çekinmeyin, geçerli ise, buradan yanıtlayın: http://stackoverflow.com/questions/42616908/how-to-use- a-proxy-alamofire-4-and-swift-3 –

+0

Evet, aynı yapılandırma URLSessionConfiguration.default kullandıklarından, alamofire oturum yöneticisi ile çalışmalıdır. Başların için teşekkürler. Cevabı orada yayınlayacağım. – manishg

1

ben bu mantıklı emin değilim.

  1. HTTP
  2. HTTPS

Vekil Tuşlar:

// http proxy keys 
kCFNetworkProxiesHTTPEnable 
kCFNetworkProxiesHTTPProxy 
kCFNetworkProxiesHTTPPort 

// https proxy keys 
kCFNetworkProxiesHTTPSEnable 
kCFNetworkProxiesHTTPSProxy 
kCFNetworkProxiesHTTPSPort 
Ben çalışma düşünüyorum
+0

Önerdiğiniz https değerlerini kopyaladım/yapıştırdım, ancak "xy kullanılamadı" durumum var. Ayrıca, HTTP "S", autofil –

+0

'da mevcut değildir, bkz. –

İlgili konular