Especificación del referer HTTP en UIWebView incrustado

En mi aplicación, le permito al usuario abrir una página externa en un UIWebView incrustado. ¿Puedo configurar el referidor que se envía con esa solicitud? Me gustaría que mi aplicación obtenga la “credibilidad” cuando el usuario abre estas páginas externas.

Configure el referer usando – setValue: forHTTPHeaderField:

NSMutableURLRequest* request = ...; [request setValue:@"https://myapp.com" forHTTPHeaderField: @"Referer"]; 

Pero tenga en cuenta que, de acuerdo con el HTTP RFC, no debería hacerlo, porque su aplicación no es direccionable mediante un URI:

El campo Referer NO DEBE enviarse si el URI de solicitud se obtuvo de una fuente que no tiene su propia URI, como la entrada desde el teclado del usuario.

… a menos que esté utilizando un protocolo personalizado enlazado a su aplicación (myapp: //blah.com/blah).

Puede crear uno y llamar a loadRequest: manualmente o interceptando una solicitud normal realizada por el usuario.

 - (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; } } 

No he usado esto por mi cuenta, pero parece que NSURLProtocol es la forma aprobada para interceptar y modificar solicitudes de URL. Aquí hay un tutorial: http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

Estoy usando su solución de enviar la solicitud a NSMutableURLRequest , pero como no está documentado que se trata de una solicitud mutable, Apple podría tener algún riesgo de usar un objeto inmutable en el futuro.