2011-10-27 21 views
12

Trong ứng dụng của tôi, tôi cho phép người dùng mở một trang bên ngoài trong UIWebView được nhúng. Tôi có thể đặt tiêu đề người giới thiệu được gửi cùng với yêu cầu đó không? Tôi muốn ứng dụng của mình nhận được 'tin cậy' khi người dùng mở các trang bên ngoài này.Chỉ định tham chiếu HTTP trong UIWebView được nhúng

Trả lời

21

Đặt referer sử dụng - setValue:forHTTPHeaderField:

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

Nhưng lưu ý rằng theo RFC HTTP bạn không nên, bởi vì ứng dụng của bạn không được địa chỉ sử dụng một URI:

Trường Referer PHẢI KHÔNG được gửi nếu URI yêu cầu được lấy từ một nguồn không có URI riêng, chẳng hạn như đầu vào từ bàn phím người dùng .

... trừ khi bạn đang sử dụng giao thức tùy chỉnh được liên kết với ứng dụng của bạn (myapp: //blah.com/blah).

Bạn có thể create one và gọi loadRequest: theo cách thủ công hoặc chặn yêu cầu bình thường của người dùng.

- (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

Cảm ơn ghi chú từ RFC. Tôi không biết điều đó. Màn hình mà người dùng của tôi bật khi họ mở liên kết bên ngoài trong trình duyệt có URI của riêng nó, vì vậy tôi không áp dụng điều đó cho tôi. –

+0

Tôi lấy trường hợp NSMutableURLRequest từ đâu? UIWebViewDelegate không cung cấp cho tôi phiên bản Mutable. Tôi tìm thấy một số tài liệu tham khảo nói rằng tôi có thể đáng tin cậy đúc nó, nhưng tôi tự hỏi nếu có một cách đẹp hơn. –

+0

Tôi không biết nếu đó là kosher, nhưng bạn có thể đánh chặn và khởi chạy lại yêu cầu. – Jano

0

Tôi chưa tự sử dụng, nhưng có vẻ như NSURLProtocol là cách được chấp thuận để chặn và sửa đổi yêu cầu URL. Dưới đây là hướng dẫn: http://www.raywenderlich.com/59982/nsurlprotocol-tutorial

Tôi đang sử dụng giải pháp của bạn để gửi yêu cầu đến NSMutableURLRequest, nhưng vì nó không được ghi nhận rằng đây là yêu cầu có thể thay đổi, có một số rủi ro mà Apple có thể sử dụng đối tượng không thay đổi trong tương lai.

Các vấn đề liên quan