В моем приложении я разрешаю пользователю открывать внешнюю страницу во встроенном интерфейсе UIWebView. Возможно ли установить заголовок реферера, отправленный с этим запросом? Я бы хотел, чтобы мое приложение получило "cred", когда пользователь открывает эти внешние страницы.
Задание HTTP-реферера во встроенном интерфейсе UIWebView
Ответ 1
Установите референт с помощью - setValue: forHTTPHeaderField:
NSMutableURLRequest* request = ...;
[request setValue:@"https://myapp.com" forHTTPHeaderField: @"Referer"];
Но обратите внимание, что в соответствии с HTTP RFC вы не должны, потому что ваше приложение не адресуется с помощью URI:
Поле Referer НЕ ДОЛЖНО быть отправлено, если был получен Request-URI из источника, который не имеет собственного URI, например, ввода из пользовательская клавиатура.
... если вы не используете собственный протокол, привязанный к вашему приложению (myapp://blah.com/blah).
Вы можете создать один и вызвать loadRequest: вручную или перехватить обычный запрос, сделанный пользователем.
- (BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType) navigationType
{
NSDictionary *headers = [request allHTTPHeaderFields];
BOOL hasReferer = [headers objectForKey:@"Referer"]!=nil;
if (hasReferer) {
// .. is this my referer?
return YES;
} else {
// relaunch with a modified request
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSURL *url = [request URL];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setHTTPMethod:@"GET"];
[request setValue:@"https://whatever.com" forHTTPHeaderField: @"Referer"];
[self.webView loadRequest:request];
});
});
return NO;
}
}
Ответ 2
Я не использовал это сам, но похоже, что NSURLProtocol
- это одобренный способ перехвата и изменения запросов URL. Вот учебник: http://www.raywenderlich.com/59982/nsurlprotocol-tutorial
Я использую ваше решение для запроса запроса на NSMutableURLRequest
, но поскольку он не документировал, что это изменчивый запрос, существует некоторый риск того, что Apple может использовать неизменяемый объект в будущем.