2010-07-29 80 views
4

我的應用使用NSURLProtocol的子類化。在應用程序中有幾個UIWebViews,並且在NSURLProtocol中實現了特定算法,我需要知道哪一個UIWebView發送請求。如何從NSURLProtocol中獲取請求的UIWebView

我的理解是,[self client]返回的對象應該與請求對象有些連接。但NSURLProtocolClient(即由[self client]返回的對象實現的協議)和底層對象_NSCFURLProtocolBridge都沒有任何屬性/方法來獲取請求的發件人。

任何人都可以幫助我的想法嗎?

回答

-1

理想情況下,您不應該直接從NSURLProtocol引用UIWebView。不過,我過去需要有一個NSURLProtocol將消息發送到UIWebView,而這些消息不在常規的委託消息之中......使用NSNotificationCenter,我使用NSURLRequest對象作爲對象發佈通知,並訂閱我感興趣的通知監聽器。

0

在的loadRequest:

static NSString* [email protected]"urAPP_ProtocolClient"; 

    NSMutableURLRequest* Request=[request mutableCopy]; 
    [Request setValue:[NSString stringWithFormat:@"someID",self.someID] forHTTPHeaderField:ProtocolClient]; 

在協議:

NSString* header=[_currentRequest valueForHTTPHeaderField:ProtocolClient]; 

if (header) { 
+0

我當然可以區分我明確創建的請求。問題是關於UIWebView自己發送引用資源(如圖像,腳本文件等)的請求。不管怎麼說,還是要謝謝你。 – okonov 2012-02-01 02:22:03

3

NSURLRequest有一個稱爲mainDocumentURL方法,該方法返回根文檔的URL。你都不可能保存走在UIWebViewDelegate方法就是這樣,

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if([[request.URL absoluteString] isEqualToString:[request.mainDocumentURL absoluteString]]) 
    { 
     // associate this URL with this UIWebview 
    } 
} 

然後你可以看一下在mainDocumentURLNSURLProtocol方法來鑑定UIWebView。這並非萬無一失,因爲它沒有考慮多個UIWebViews加載相同URL的情況。但這是我能想到的最好的解決方案。

1

請參閱https://stackoverflow.com/a/19700910/502149。總而言之,您可以在使用用戶默認設置創建用戶代理之前,爲每個UIWebView設置用戶代理。由於該視圖不考慮用戶代理的後續更改,因此每個UIWebView中最終都會有不同的用戶代理。您可以在NSURLProtcol中使用它來標識視圖,並且可以傳遞真實的UA代理,以便服務器不會看到任何差異。

請注意,對於UIWebView要「記住」UA字符串設置,它必須在設置更改前至少發出一個請求。

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

請求是可變類型。因此,您可以使用
+[NSURLProtocol setProperty:forKey:inRequest:]來設置自定義屬性。 和+[NSURLProtocol propertyForKey:inRequest] from NSURLProtocol