Check out the iOS URL loading system as well as NSURLProtocol
You can write your own NSURLProtocol class for your NSURLRequest. Custom NSURLProtocol can intercept your requests and add proxies for each request. the corresponding method -(void)startLoading , inside this method you can use Core-Function, which is a slightly low-level api in iOS to add a proxy to each request:
//"request" is your NSURLRequest NSURL *url = [request URL]; NSString *urlString = [url absoluteString]; CFStringRef urlStringRef = (CFStringRef) urlString; CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, urlStringRef, NULL); CFStringRef requestMethod = CFSTR("GET"); CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1); self.httpMessageRef = CFHTTPMessageCreateCopy(kCFAllocatorDefault, myRequest); CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest); // You can add body, headers.... using core function api, CFNetwork.etc // below code is to set proxy from code if needs NSString *hostKey; NSString *portKey; if ([[[urlString scheme] lowercaseString] isEqualToString:@"https"]) { hostKey = (NSString *)kCFStreamPropertyHTTPSProxyHost; portKey = (NSString *)kCFStreamPropertyHTTPSProxyPort; } else { hostKey = (NSString *)kCFStreamPropertyHTTPProxyHost; portKey = (NSString *)kCFStreamPropertyHTTPProxyPort; } //set http or https proxy, change "localhost" to your proxy host, change "5566" to your proxy port NSMutableDictionary *proxyToUse = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"localhost",hostKey,[NSNumber numberWithInt:5566],portKey,nil]; CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPProxy, proxyToUse); CFReadStreamOpen(myReadStream);
Hope this can help you.
Forget registering your custom NSURLProtocol for your delegate.
source share