2013-05-31 1 views
6

Я настраиваю веб-просмотр, но мне нужно загрузить содержимое веб-обозревателя с помощью прокси-сервера. Любой из вас знает, как я могу реализовать прокси-сервер в NSURLRequest?iOS любое тело знает, как добавить прокси-сервер в NSURLRequest?

, например:

NSString *[email protected]"http://google.com"; 
    NSURL *url=[NSURL URLWithString:location]; 
    NSURLRequest *request=[NSURLRequest requestWithURL:url]; 
// some code to set the proxy 

    [self.myWebView loadRequest:request]; 

Я очень ценю вашу помощь

ответ

2

Вы не можете добавить прокси NSURLRequest. Вам нужно будет использовать стороннюю библиотеку, такую ​​как ASIHTTPRequest.

// Configure a proxy server manually 
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"]; 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setProxyHost:@"192.168.0.1"]; 
[request setProxyPort:3128]; 
+2

ASIHTTPRequest больше не поддерживается разработчиком. Рассмотрите возможность использования AFNetworking. – NSRover

+0

ASIHTTPRequest выполняет работу! Благодаря! –

+0

, если вы внимательно изучаете ASIHTTPRequest, как работают 'setProxyHost' и' setProxyPort', код низкого уровня в значительной степени совпадает с моим ответом выше, ASIHTTPRequest просто обертывает все эти низкоуровневые основные функциональные коды. Если он больше не поддерживается, почему бы вам просто не написать его самостоятельно :-). –

7

Взгляните на 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 для своего делегата.

+0

не работает, может yu разработать больше? –

+0

Не зная Objective-C, я попытался реализовать пользовательский NSURLProtocol (в моем коде я собираюсь использовать no-proxy: //), но я не могу понять пару вещей: 1) почему self.httpMessageRef? 2) [схема urlString] должна быть [url-схемой], я прав? – pongi

1

Я использовал приведенный ниже код для прокси-сервера Http.

let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration(); 
sessionConfiguration.connectionProxyDictionary = [ 
    kCFNetworkProxiesHTTPEnable: true, 
    kCFNetworkProxiesHTTPPort: myPortInt, 
    kCFNetworkProxiesHTTPProxy: myProxyUrlString, 
] 
let url = NSURL(string: endPointUrl) 
let postRequest = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 10.0) 


let jsonString = bodyString 
postRequest.HTTPBody = jsonString 
postRequest.HTTPMethod = "POST" 
postRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 

let session = NSURLSession(configuration: sessionConfiguration)  
let task = session.dataTaskWithRequest(postRequest){} 
+0

http://stackoverflow.com/questions/40246010/how-to-add-a-https-proxy-to-nsurlsession-in-swift-3 –