2012-02-24 47 views
2

我有一個UIWebView(與網站連接)的應用程序;用戶將導航到該網站。之後,我希望當用戶打開應用程序並且沒有連接時,已訪問的頁面將可以訪問。在iOS應用程序內創建代理

所以我認爲應該可以的,如果我在應用程序中創建一個內部代理:每個請求將由該代理處理(並將結果發送到UIWebView)。當然,代理應該緩存網頁,如果沒有可用的連接,則使用緩存的頁面。

我更喜歡這種方法,而不是其他方式(HTML5離線緩存),因爲將來我可以爲代理設置一些功能,例如「我想緩存所有圖片在接下來的5個小時」等。 ..

你知道是否有可能,如果是,我該用什麼來做? 或者...你知道是否有類似的東西已經完成(一些Objective-C Proxy?)?

+0

有關這個的簡單實現,以及如何構建更復雜的實現的討論,請參閱http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588 – 2013-01-30 00:56:06

回答

0

最簡單的方法是使用HTTP緩存機制。您可以在Web服務器上設置HTTP標頭嗎?如果是這樣,您可以爲網站上的每張圖片或其他資源設置最大年齡,以將其保留在緩存中一段時間​​。

UIWebView將尊重HTTP標頭。

這是最簡單的方法,但它是有限的。 iOS設置了某些緩存大小限制。大型資源可能無法緩存或可能會從緩存中快速踢出其他資源。

另一種方法是將您自己的資源請求發送到NSURLRequest並指定NSURLRequestUseProtocolCachePolicy標誌。您可以遵守Web服務器緩存,也可以覆蓋該緩存。在這種情況下,iOS爲您處理緩存。問題是你不能爲UIWebView指定一個代理。這意味着您必須自己管理重定向到您的代理。您需要分析網站內容並捕獲圖片,CSS,javascript等內部請求。

還有一種方法是處理這兩個請求並自行緩存。這顯然是最辛苦的方式,但你會完全控制在你的手中。

您可能想要在代碼中使用ASIWebPageRequestProxyingUIWebView或從自己的實現中獲取想法。