2011-10-27 36 views

Respuesta

21

Ajuste el referer usando - setValue:forHTTPHeaderField:

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

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

El campo de referencia NO DEBE se enviará si el URI de solicitud se obtuvo desde 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 create one y llamar al loadRequest: manualmente o interceptar una solicitud normal hecha 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; 
    } 
} 
+0

Gracias por la nota de la RFC. No estaba enterado de eso. La pantalla en la que mi usuario está cuando abren el enlace externo en el navegador tiene su propio URI, por lo que no me corresponde. –

+0

¿De dónde obtengo la instancia de NSMutableURLRequest? UIWebViewDelegate no me da la versión mutable. Encontré algunas referencias que decían que podía lanzarlo de manera confiable, pero me pregunto si hay una manera más agradable. –

+0

No sé si eso es kosher, pero puedes interceptar y volver a lanzar la solicitud. – Jano

0

No he utilizado yo mismo, pero parece que NSURLProtocol es la forma aprobada para interceptar y modificar las peticiones de URL. He aquí un tutorial: http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

Estoy usando su solución de enviar la solicitud al 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.