2017-03-06 1 views
13

API 요청에 대해 프록시를 사용하여 URLSession을 설정하려고합니다. 테스트 목적으로 IP에 응답하는 공용 프록시와 API를 사용하고 있습니다. 에 의해 불려Swift에서 Proxy와 함께 URLSession을 사용하는 방법 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() 
} 

가 : 심지어와 프록시 IP를 만들었 기 때문에

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

그것은 config 것 같아 완전히 무시되면, 반응 IP는 항상

어떤 도움이 매우있는 실제 장치의 IP입니다 고맙습니다.

편집 : hasan83 사용자가 제안한대로 "the HTTPS keys"는 옵션이 아닌 것으로 보입니다.

enter image description here enter image description here

+0

안녕하세요, 142.54.173.19이 IP가 어떤 IP 주소, 라우터 또는 다른입니다을 줄 수 있습니다. ? –

답변

7

(생각하지만, 여기에 키의 두 defferent 세트가 더 이상 사용되지 않음) 키는 다음과 같습니다.

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

는 그 감각을 만들 경우 모르겠습니다.

  1. HTTP
  2. HTTPS

프록시 키 :

// http proxy keys 
kCFNetworkProxiesHTTPEnable 
kCFNetworkProxiesHTTPProxy 
kCFNetworkProxiesHTTPPort 

// https proxy keys 
kCFNetworkProxiesHTTPSEnable 
kCFNetworkProxiesHTTPSProxy 
kCFNetworkProxiesHTTPSPort 
내가 작업을 생각
+0

제안한 https 값을 복사/붙여 넣었지만 "xy를 사용할 수 없습니다."라는 메시지가 나타납니다. 더하기, HTTP "S"하나는 자동 파일에서 사용할 수 없습니다 –

+0

추가 된 화면보기 –

관련 문제