Взгляните на iOS URL Loading System, а также NSURLProtocol
Вы можете написать собственный класс NSURLProtocol для NSURLRequest. Пользовательский NSURLProtocol может перехватывать ваши запросы и добавлять прокси для каждого запроса. соответствующий метод -(void)startLoading
, внутри этого метода вы можете использовать Core-Function, которая немного низкоуровневого API в прошивкой, чтобы добавить прокси-сервер для каждого запроса:
//"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);
надеюсь, что это может помочь вам.
Не забудьте зарегистрировать свой пользовательский NSURLProtocol для своего делегата.
ASIHTTPRequest больше не поддерживается разработчиком. Рассмотрите возможность использования AFNetworking. – NSRover
ASIHTTPRequest выполняет работу! Благодаря! –
, если вы внимательно изучаете ASIHTTPRequest, как работают 'setProxyHost' и' setProxyPort', код низкого уровня в значительной степени совпадает с моим ответом выше, ASIHTTPRequest просто обертывает все эти низкоуровневые основные функциональные коды. Если он больше не поддерживается, почему бы вам просто не написать его самостоятельно :-). –