2010-05-12 74 views
7

我有一個使用WebKit WebView的應用程序,並且希望將使用自定義URL協議加載到此WebView中的URL映射到不同的HTTP URL。例如,假設我加載:將自定義URL協議映射到HTTP(使用NSURLProtocol?)

定製://路徑/到/資源

我希望可以先內部實際負載:

http://something-else.com/path/to/resource

換句話說,自定義協議供應幾乎就像一個簡寫。但我不能使用-webView:resource:willSendRequest:redirectResponse:fromDataSource :,因爲我想讓WebKit真正相信這是有問題的URL,而不是簡單地從一個重定向到另一個。

到目前爲止,我一直在嘗試使用自定義的NSURLProtocol子類。然而,這比我第一次想到的要複雜得多,因爲至少在我的理解中,我將不得不自己在NSURLProtocol子類的startLoading方法中進行實際加載。我想要一種將工作交給現有HTTP協議加載器的方式,但我找不到一種簡單的方法來完成此操作。

有沒有人有這樣的建議,或者解決這個問題的替代方法?

謝謝!

回答

3

我使用策略委託。它有一些缺點,但它對我的需求來說簡單而充分。我做這樣的事情:

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener; 

{ 
    if ([request.URL.scheme isEqualToString:@"custom"]) { 

     // do something interesting 
     // like force the webview to load another URL 

     [listener ignore]; 
     return; 
    } 

    [listener use]; 
} 

爲我用,我還需要停止JS事件的傳播。所以我通常把URL放在一個onclick事件處理函數中,它調用window.event.stopPropagation();設置完location.href後。

這不是很花哨,但它是一個非常靈活和非常簡單的方式來溝通一個JS事件可可。

+0

這是否有使WebView認爲它在自定義協議URL的作用?如果我只是從該if塊中加載一個新URL,我感覺我會和以前一樣:有效地創建一個重定向。但也許我誤解了我應該從那裏加載一個新的URL的時尚。 – 2010-05-12 07:32:12

+0

「這是否有使webview認爲它在自定義協議URL的作用?」 不,絕對不是。如果您的目標是將href.location設置爲一項,然後加載另一項,那麼此解決方案將無法將您帶到那裏。抱歉。在這種情況下,當檢測到自定義方案時,即使它被殺死 - 因此location.href永遠不會改變。 「有效地創建重定向」 它不同於重定向。在重定向中,第一個URL被加載,處理等。然後加載下一個URL。使用策略委託並調用[listener ignore]會完全殺死第一個URL負載。 – isaiah 2010-05-12 07:56:59

0

您可以實現WebResourceLoadDelegate方法:

- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource 

這應該允許您更改一個與HTTP URL請求。

或者,實施NSURLProtocol子類對此並不難,因爲您的協議可以使用正確的HTTP URL在內部激活另一個NSURLConnection,並將其委託方法映射到協議客戶端。

相關問題