在embedded的UIWebView中指定HTTP引用

在我的应用程序中,我允许用户在embedded式UIWebView中打开一个外部页面。 是否可以设置与请求一起发送的引用标头? 我想让我的应用程序在用户打开这些外部页面时获得“信誉”。

使用setValue设置引用者 :forHTTPHeaderField:

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

但请注意,根据HTTP RFC你不应该,因为你的应用程序不能使用URI寻址:

如果Request-URI是从一个没有自己的URI的源获得的,比如来自用户键盘的input,则不应该发送Referer字段。

…除非你使用绑定到你的应用程序的自定义协议(myapp://blah.com/blah)。

您可以创build一个并手动调用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; } } 

我自己并没有使用这个,但看起来NSURLProtocol是批准的拦截和修改URL请求的方式。 这是一个教程: http : //www.raywenderlich.com/59982/nsurlprotocol-tutorial

我正在使用您的解决scheme将请求转换为NSMutableURLRequest ,但是由于没有logging这是一个可变的请求,因此Apple将来可能会使用不可变对象。