Задание HTTP-реферера во встроенном интерфейсе UIWebView - программирование
Подтвердить что ты не робот

Задание HTTP-реферера во встроенном интерфейсе UIWebView

В моем приложении я разрешаю пользователю открывать внешнюю страницу во встроенном интерфейсе UIWebView. Возможно ли установить заголовок реферера, отправленный с этим запросом? Я бы хотел, чтобы мое приложение получило "cred", когда пользователь открывает эти внешние страницы.

4b9b3361

Ответ 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 может использовать неизменяемый объект в будущем.