How to programmatically add a proxy to an NSURLSession

前端 未结 6 1220
醉酒成梦
醉酒成梦 2020-12-01 05:02

Looking over the documentation of NSURLSession and NSURLSessionConfiguration, I was under the impression I should configure it with a dictionary li

相关标签:
6条回答
  • 2020-12-01 05:18

    Based on all previous responses, this works for Swift 4, both HTTP and 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 should be a hostname and not contain any URL scheme.

    0 讨论(0)
  • 2020-12-01 05:19

    Since several of Jeff's answer keys were deprecated I use this ones

    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;
    
    0 讨论(0)
  • 2020-12-01 05:26

    Swift 3 extension

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

    Usage:

    let session = URLSession().withProxy(proxyURL: "xxxxxx", proxyPort: 8321)
    
    0 讨论(0)
  • 2020-12-01 05:28

    If anyone needs the swift version of this:

    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 讨论(0)
  • 2020-12-01 05:31

    It turns out, the dictionary keys you want are the Stream variants, they are the ones that resolve down to "HTTPProxy" and such:

    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 讨论(0)
  • 2020-12-01 05:37

    kCFProxyPortNumberKey value should be Int not String

    0 讨论(0)
提交回复
热议问题