2011-10-27 28 views
12

在我的應用程序中,我允許用戶在嵌入式UIWebView中打開一個外部頁面。我可以設置與請求一起發送的引用標頭嗎?我希望我的應用在用戶打開這些外部頁面時獲得'信譽'。使用- setValue:forHTTPHeaderField:在嵌入式UIWebView中指定HTTP引用程序

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

但需要注意的

回答

21

設置referer,根據HTTP RFC你不應該,因爲你的應用程序不能尋址使用URI:

引薦字段不能如果從沒有自己的URI(例如來自 用戶鍵盤的輸入)的源獲得請求URI獲得 ,則被髮送。

...除非您使用綁定到您的應用程序的自定義協議(myapp://blah.com/blah)。

您可以create one手動或調用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

感謝來自RFC的說明。我沒有意識到這一點。我的用戶在瀏覽器中打開外部鏈接時所在的屏幕有自己的URI,所以我不適用於我。 –

+0

我從哪裏得到NSMutableURLRequest實例? UIWebViewDelegate不給我Mutable版本。我發現一些參考文獻說我可以可靠地施放它,但我想知道是否有更好的方法。 –

+0

我不知道這是否是猶太教,但你可以攔截並重新發起請求。 – Jano

0

我沒有這個使用自己,但它看起來像NSURLProtocol是截獲並修改URL請求批准的方式。這裏有一個教程:http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

我正在使用您的解決方案將請求轉換爲NSMutableURLRequest,但由於沒有記錄這是一個可變請求,因此Apple將來可能會使用不可變對象。

相關問題