Указание HTTP реферера во встроенном UIWebView - PullRequest
14 голосов
/ 27 октября 2011

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

Ответы [ 2 ]

21 голосов
/ 27 октября 2011

Установите referer , используя - 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;
    }
}
0 голосов
/ 06 ноября 2014

Я сам этим не пользовался, но похоже, что NSURLProtocol - это одобренный способ перехвата и изменения запросов URL. Вот учебник: http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

Я использую ваше решение приведения запроса к NSMutableURLRequest, но, поскольку не задокументировано, что это изменяемый запрос, существует некоторый риск того, что Apple может использовать неизменный объект в будущем.

...