2015-01-23 5 views
10

hinzuzufügen, war ich unter dem Eindruck, sollte ich es so konfigurieren, mit einem Wörterbuch wie folgt aus:Wie programm einen Proxy zu einem NSURLSession

// Create a dictionary to describe the proxy 
    NSDictionary *proxyDict = @{ 
     (NSString *)kCFProxyHostNameKey : @"myProxyHost.com", 
     (NSString *)kCFProxyPortNumberKey : @"12345", 
     (NSString *)kCFProxyTypeKey  : (NSString*)kCFProxyTypeHTTP 
    }; 

    // Create a configuration that uses the dictionary 
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    [configuration setConnectionProxyDictionary:proxyDict]; 

jedoch die Anforderungen von NSURLSession erstellt mit dieser Konfiguration direkt verbinden.

Antwort

17

Es stellt sich heraus, die Dictionary-Schlüssel Sie sind Varianten der Stream wollen, sind sie diejenigen, die auf „Httpproxy“ lösen nach unten und so:

NSString* proxyHost = @"myProxyHost.com"; 
NSNumber* proxyPort = [NSNumber numberWithInt: 12345]; 

// Create an NSURLSessionConfiguration that uses the proxy 
NSDictionary *proxyDict = @{ 
    @"HTTPEnable" : [NSNumber numberWithInt:1], 
    (NSString *)kCFStreamPropertyHTTPProxyHost : proxyHost, 
    (NSString *)kCFStreamPropertyHTTPProxyPort : proxyPort, 

    @"HTTPSEnable" : [NSNumber numberWithInt:1], 
    (NSString *)kCFStreamPropertyHTTPSProxyHost : proxyHost, 
    (NSString *)kCFStreamPropertyHTTPSProxyPort : proxyPort, 
}; 

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; 
configuration.connectionProxyDictionary = proxyDict; 

// Create a NSURLSession with our proxy aware configuration 
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

// Form the request 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com?2"]]; 

// Dispatch the request on our custom configured session 
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler: 
           ^(NSData *data, NSURLResponse *response, NSError *error) { 
            NSLog(@"NSURLSession got the response [%@]", response); 
            NSLog(@"NSURLSession got the data [%@]", data); 
           }]; 

NSLog(@"Lets fire up the task!"); 
[task resume]; 
+0

Vielen Dank! Eine Million mal danke! Ich hätte das nie herausgefunden. Sicher wäre es schön, wenn Apple das dokumentieren würde. – bugloaf

+0

Vielen Dank! Du bist ein Lebensretter! –

+0

@Jeff - Ich habe es versucht .. Aber die Daten aus '^ (NSData * data, NSURLResponse * response, NSError * error) gibt die Ergebnisse von myProxyHost.com und nicht www.google.com Kann mir helfen –

6

Seit Antwort Schlüssel des mehrere von Jeff waren ich diese veraltet verwenden diejenigen

NSMutableDictionary *proxy=[NSMutableDictionary dictionaryWithDictionary:@{(__bridge NSString *)kCFNetworkProxiesHTTPEnable : @1, (__bridge NSString *)kCFNetworkProxiesHTTPSEnable : @1}]; 
proxy[(__bridge NSString *)kCFNetworkProxiesHTTPProxy] =host; 
proxy[(__bridge NSString *)kCFNetworkProxiesHTTPSProxy]=host; 
proxy[(__bridge NSString *)kCFNetworkProxiesHTTPPort] =port; 
proxy[(__bridge NSString *)kCFNetworkProxiesHTTPSPort] =port; 
proxy[(__bridge NSString *)kCFProxyUsernameKey]=user; 
proxy[(__bridge NSString *)kCFProxyPasswordKey]=password; 

configuration.connectionProxyDictionary=proxy; 
7

Wenn jemand die schnelle Version dieser benötigt:

Swift 3

let sessionConfiguration = URLSessionConfiguration.default 
sessionConfiguration.connectionProxyDictionary = [ 
    kCFNetworkProxiesHTTPEnable as AnyHashable: true, 
    kCFNetworkProxiesHTTPPort as AnyHashable: 999, //myPortInt 
    kCFNetworkProxiesHTTPProxy as AnyHashable: "myProxyUrlString" 
] 
let session = URLSession(configuration: sessionConfiguration) 
+0

Ich habe Probleme damit. auch wenn sie verwendet wird, ist die ip von meiner api-anfrage dieselbe wie ohne proxy ... –

+0

http://stackoverflow.com/questions/42617582/how-to-use-urlsession-with-proxy-in-swift-3 –

4

kCFProxyPortNumberKey Wert Int nicht String

1

Swift 3 Erweiterung

extension URLSession { 

    func withProxy(proxyURL: String, proxyPort: Int) -> URLSession { 

     var configuration = self.configuration 

     configuration.connectionProxyDictionary = [ 
      kCFNetworkProxiesHTTPEnable as AnyHashable : true, 
      kCFNetworkProxiesHTTPPort as AnyHashable : proxyPort, 
      kCFNetworkProxiesHTTPProxy as AnyHashable : proxyURL 
     ] 

     return URLSession(configuration: configuration, delegate: self.delegate, delegateQueue: self.delegateQueue) 
    } 
} 

Verbrauch sein sollte:

let session = URLSession().withProxy(proxyURL: "xxxxxx", proxyPort: 8321) 
1

Basierend auf allen bisherigen Antworten, dies für Swift arbeitet 4, die beide HTTP und HTTPS:

let proxyHost = "127.0.0.1" 
let proxyPort = 8888 
let configuration = URLSessionConfiguration.default 
configuration.connectionProxyDictionary = [ 
    kCFNetworkProxiesHTTPEnable: true, 
    kCFNetworkProxiesHTTPProxy: proxyHost, 
    kCFNetworkProxiesHTTPPort: proxyPort, 
    kCFNetworkProxiesHTTPSEnable: true, 
    kCFNetworkProxiesHTTPSProxy: proxyHost, 
    kCFNetworkProxiesHTTPSPort: proxyPort 
] 

proxyHost sollte ein Hostname sein und kein URL-Schema enthalten.