2017-03-06 84 views
13

APIリクエストについてプロキシを使用してURLセッションを設定しようとしています。テスト目的のために、私はIPに応答する公開プロキシとAPIを使用しています。 configが完全にさえ作っプロキシIP、応答したIPと常に実際のデバイスのIPSwiftのProxyでURLSessionを使用する方法3

であるため、すべてのヘルプは非常にあり、無視されるように思え

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

:によって呼び出され

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() 
} 

感謝。

編集:ユーザーhasan83が提案しているように、「HTTPSキー」はオプションではないようです。

enter image description here enter image description here

+0

こんにちは、142.54.173.19このIPは、どのIPアドレス、ルータまたは他のですが与えるかもしれません。 ? –

答えて

7

を私は作業が(はずだと思います推奨されなくなる)キーは次のとおりです。

kCFStreamPropertyHTTPSProxyHost 
kCFStreamPropertyHTTPSProxyPort 

このコードを試してください。

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() 
} 

また、プロキシサーバーがhttps要求を処理するように設定されていることを確認してください。

注:これは、これらのキーが、キーのdeprecated警告まだ働いている(https://forums.developer.apple.com/thread/19356#131446を参照)

+0

が動作するようです。明日より多くのテストを受けるだろうが、これはそうであるようだ。 –

+0

私の現在の研究が行く限り、あなたの設定はここでもうまくいくはずですので、試してみてください。有効であれば、ここでも答えてください:http://stackoverflow.com/questions/42616908/how-to-use- a-proxy-server-with-alamofire-4-and-swift-3 –

+0

ええ、URLSessionConfiguration.defaultも使用しているので、同じ設定はalamofireセッションマネージャで動作するはずです。ヘッドアップをありがとう。私はそこに答えを掲示します。 – manishg

1

私はそれが意味をなすかどうかわからないです。しかし、キーの2つのdefferentセットがここにあります:

  1. HTTP
  2. HTTPS

プロキシキー:

// http proxy keys 
kCFNetworkProxiesHTTPEnable 
kCFNetworkProxiesHTTPProxy 
kCFNetworkProxiesHTTPPort 

// https proxy keys 
kCFNetworkProxiesHTTPSEnable 
kCFNetworkProxiesHTTPSProxy 
kCFNetworkProxiesHTTPSPort 
+0

あなたが提案したhttps値をコピーして貼り付けましたが、「xyが利用できません」と表示されています。さらに、HTTP "S"は自動ファイルでは利用できません –

+0

追加された画面を参照 –

関連する問題