2010-01-19 41 views
4

我試圖解決兩件事情在我UIWebView陷入困境的關係:的UIWebView和NSURLCache有

  1. 加載本地資產替代性遠程監控的,在適當的條件下
  2. 加載遠程資產爲正常,如果有沒有本地的或者他們已經過時
  3. 允許web視圖去「背」,而無需重新加載它的HTML表單服務器

所以處理#1和#2,我implemen定製了一個自定義子類NSURLCache。它在webview請求資產時被調用,並且我可以沿着本地發送,而不是中止服務器對資產的調用。我甚至有一個小時間戳系統,知道本地版本是否舊,或者不知道要使用哪一個。

但#3扔我一個循環。看起來無論緩存控制標題如何,UIWebView總會在返回時重新加載HTML。

於是,我就強迫HTML緩存在我的自定義NSURLCache類。它似乎工作,並返回與我想要的HTML NSCachedURLResponse的實例,但UIWebView無法注意並從服務器加載它。經過一番搜索後,我發現UIWebView和url緩存存在一些「不一致性」,我想這是一個。非常適合資產,但對於構​​成要顯示的頁面的HTML來說並不那麼好。

因此,我決定,因爲這可能無法正常工作,請手動完成。我創建了一堆網址,以及我手動獲取並加載數據的loadData:MIMEType:textEncodingName:baseURL:。你看,它似乎很好!我現在可以回去了,web視圖委託會攔截負載,並告訴它加載手動提取的數據,而服務器不會被命中。

不過,後來我發現這是不再使用我的資產NSURLCache。如果您使用loadRequest:加載內容,而不是通過加載數據或正確設置baseUrl的html字符串,它似乎只會請求緩存的資產。

因此,儘管我的努力,我不能讓Web視圖有條件地加載本地資產,然後返回沒有擊中服務器。似乎我在SDK中有一些錯誤。

  1. UIWebView忽略服務器Cache-Control標題爲HTML內容
  2. UIWebView要求一個NSCachedURLResponse的主HTML請求,但是然後被忽略並丟棄。
  3. UIWebView向資產請求NSURLCache,如果您使用請求加載資源,但使用HTML或數據加載時,它會完全繞過緩存並直接從遠程服務器請求。

信息首先,任何人看到了解決這些事?其次,任何我愚蠢的原因,而這些實際上並不是SDK錯誤?

回答

1

我已經放棄了這一點。有太多的陷阱。相反,我只是通過ajax加載新頁面。而不是[webview goBack]我有一些自定義JavaScript來做我很酷的東西[webview stringByEvaluatingJavascriptFromString:@"goBack()"]

+0

好主意 - 因爲這也節省了內存分配 - 但是如何從網絡或緩存中獲取@ runtime所需的圖像資源?我必須有時解決它,但不知道如何...這是我的嘗試:http://stackoverflow.com/questions/3215641/overriding-nsurlcaches-cachedresponseforrequest-to-cache-uiwebview-assets-with-t – 2010-07-09 22:55:45

+0

你可以真的。混合遠程內容和本地內容似乎是一個巨大的問題。 NSURLCache覆蓋並不像廣告那樣工作。但是如果內容在本地啓動,加載了'file://'樣式的url,它可以很好地引用遠程資產和本地資產。但這意味着您必須手動下載html,css,js等本地副本。它工作正常,但仍然不容易。 – 2010-07-10 01:10:33

1

爲了解決你的第一個3:

儘管它可能看起來有點非正統的,怎麼樣持續下載的HTML到NSUserDefaults的對象作爲扁帶,並恢復它(有條件)後,當你需要它?

+0

可悲的是,現在是一個有爭議的問題。我更改了我的服務器代碼以通過ajax加載新頁面,因此webview從不「重新加載」。這種方式似乎更快,更易於管理。 – 2010-01-20 18:27:21