2011-10-27 17 views
12

में HTTP रेफरर निर्दिष्ट करना मेरे ऐप में, मैं उपयोगकर्ता को एक एम्बेडेड UIWebView में एक बाहरी पृष्ठ खोलने की अनुमति देता हूं। क्या मेरे लिए उस अनुरोध के साथ भेजे गए रेफरर हेडर को सेट करना संभव है? जब मैं उपयोगकर्ता इन बाहरी पृष्ठों को खोलता हूं तो मैं अपने ऐप को 'क्रेडिट' प्राप्त करना चाहता हूं।एम्बेडेड UIWebView

उत्तर

21

referer सेट - setValue:forHTTPHeaderField:

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

लेकिन का उपयोग कर ध्यान दें कि HTTP आरएफसी के अनुसार आपको चाहिए नहीं, क्योंकि आपके एप्लिकेशन यूआरआई का उपयोग कर पता योग्य नहीं है:

रेफ़रलकर्ता फ़ील्ड नहीं होना चाहिए अगर अनुरोध-यूआरआई को उस स्रोत से प्राप्त किया गया था, जिसमें उपयोगकर्ता कीबोर्ड से इनपुट जैसे यूआरआई नहीं है।

... जब तक कि आप अपने ऐप (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

आरएफसी से नोट के लिए धन्यवाद। मुझे इसके बारे में पता नहीं था। जिस ब्राउज़र पर मेरा उपयोगकर्ता ब्राउज़र में बाहरी लिंक खोलता है, उसका अपना यूआरआई होता है, इसलिए मैं उस पर लागू नहीं होता। –

+0

मुझे NSMutableURLRequest उदाहरण कहां से मिलता है? UIWebViewDelegate मुझे म्यूटेबल संस्करण नहीं देता है। मुझे कुछ संदर्भ मिलते हुए कहा गया कि मैं इसे विश्वसनीय रूप से डाल सकता हूं, लेकिन मुझे आश्चर्य है कि क्या कोई अच्छा तरीका है। –

+0

मुझे नहीं पता कि यह कोशेर है, लेकिन आप अनुरोध को रोक और पुनः लॉन्च कर सकते हैं। – Jano

0

मैं इस अपने आप उपयोग नहीं किया है, लेकिन ऐसा लगता NSURLProtocol तरह रोकना और यूआरएल अनुरोधों को संशोधित करने को मंजूरी दे दी तरीका है। यहाँ एक ट्यूटोरियल है: http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

मैं NSMutableURLRequest करने के लिए अनुरोध कास्टिंग के अपने समाधान का उपयोग कर रहा है, लेकिन क्योंकि यह दर्ज नहीं किया है कि यह एक अस्थायी अनुरोध है, वहाँ कुछ जोखिम है कि एप्पल भविष्य में एक अपरिवर्तनीय वस्तु का उपयोग कर सकते है।