Enviar encabezados personalizados con UIWebView loadRequest

Quiero poder enviar algunos encabezados adicionales con mi método UIWebView loadRequest .

Yo he tratado:

 NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.reliply.org/tools/requestheaders.php"]]; [req addValue:@"hello" forHTTPHeaderField:@"aHeader"]; [self.theWebView loadRequest:req]; 

También he intentado subclasificar el UIWebView e interceptar el - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType method - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType .

En ese método tenía un bloque de código que se veía así:

 NSMutableURLRequest *newRequest = [request mutableCopy]; for(NSString *key in [customHeaders allKeys]) { [newRequest setValue:[customHeaders valueForKey:key] forHTTPHeaderField:key]; } [self loadRequest:newRequest]; 

Pero por alguna razón desconocida estaba causando que la vista web no cargara nada (marco en blanco) y NSURLErrorCancelled (-999) post de error NSURLErrorCancelled (-999) (todas las correcciones conocidas no me lo arreglan).

Entonces no sé qué hacer. ¿Cómo puedo enviar un encabezado personalizado junto con una request de UIWebView ?

¡Muchas gracias!

Descubrí que esta era la forma de agregar encabezados a mi request de UIWebView – anular este método de delegado:

 - (BOOL) webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType) navigationType 

Con este código:

 BOOL headerIsPresent = [[request allHTTPHeaderFields] objectForKey:@"my custom header"]!=nil; if(headerIsPresent) return YES; 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]; // set the new headers for(NSString *key in [self.customHeaders allKeys]){ [request addValue:[self.customHeaders objectForKey:key] forHTTPHeaderField:key]; } // reload the request [self loadRequest:request]; }); }); return NO; 

La respuesta de Thomas no funcionará para (la mayoría de las) páginas web con múltiples iFrames. La solución cargará una request de iFrame en todo el UIWebView. Por ejemplo, si llama a loadRequest para una advertencia de Google. (que está en algún pequeño iFrame) el advt. se carga en todo el UIWebView y nada más.

Encuentro otra forma, puedo usar NSURLProtocol .

 -(BOOL)webView:(IMYVKWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSMutableDictionary* mapObject = [NSMutableDictionary dictionary]; mapObject[@"headers"] = request.allHTTPHeaderFields; mapObject[@"navigationType"] = @(navigationType); [webViewRequestMap setObject:mapObject forKey:request.URL.absoluteString]; return YES; } 

webViewRequestMap está estático NSMutableDictionary *

en su código personalizado NSURLProtocol:

  @interface IMYCustomURLProtocol : NSURLProtocol @end @implementation IMYCustomURLProtocol +(void)load { [NSURLProtocol registerClass:self]; } + (BOOL)canInitWithRequest:(NSURLRequest *)request { NSString* urlString = request.URL.absoluteString; NSDictionary* dictionary = webViewReuqestMap[urlString]; if (dictionary) { [webViewRequestMap removeObjectForKey:urlString]; if ([request isKindOfClass:[NSMutableURLRequest class]]) { [(id)request setValue:@"HAHA" forHTTPHeaderField:@"MeiYou Co.,Ltd"]; } } return NO; } @end