2010-01-21 43 views
0

我有一個WebApp,我一直試圖讓工作離線。 WebApp太大,甚至被縮小,只是簡單地使用應用程序緩存(事情下載,但最終得到window.applicationCache錯誤)。我試圖使用XMLHttpRequest獲取更大的腳本和主html,並將它們保存在localStorage中,並在應用程序緩存中保留一個小的加載器腳本。我看到的問題是當加載腳本在本地服務時,XMLHttpRequest返回一個網絡錯誤。當緩存正在下載時,沒有錯誤被返回並且工作正常。當我關閉應用程序緩存時,加載程序工作正常,但當然我需要網絡來獲取加載程序。iPhone應用程序緩存和XMLHttpRequest

我試過setRequestHeader("Cache-Control", "no-cache")但這沒有幫助。

任何人都有線索?

回答

1

我想我找到了解決方案。它可能適用於其他人。

我將加載器分成兩個單獨的HTML文件:一個使用XMLHttpRequest獲取所有必需的文件並將它們放在localStorage(加載器)中,另一個簡單地從localStorage中讀取文件並將它們寫入文檔中booter)與適當的包裝(例如)。引導程序具有清單文件以將其保存在應用程序緩存中。裝載程序沒有。用戶首先調用booter。如果引導程序已經在localStorage中找到文件,它就是這樣。否則,它使用location.replace()來調用加載器。加載器使用XMLHttpRequest從服務器加載文件,並將它們放在localStorage中,然後使用location.replace()重新調用啓動器。這似乎不會導致網絡錯誤。

爲了脫機運行,用戶必須在啓動WebApp的iPhone Safari瀏覽器(調用引導程序,調用引導程序)調用引導程序。在Safari中,用戶必須將WebApp(引導鏈接)添加到他們的主屏幕(使用底部的「+」按鈕)。離線時,用戶可以從主屏幕圖標進入應用程序。重新渲染需要幾秒鐘的時間,但在此之後它會完全正常工作。在線時延遲相同。從iPhone Safari瀏覽器中調用鏈接不會脫機工作,儘管它可以在線工作。

引導程序監視應用程序緩存的「更新已準備好」事件,以便在聯機時以及當iPhone檢測到引導程序的清單文件發生更改並下載新引導程序時,它將交換新緩存(window.applicationCache.swapCache() )並再次使用location.replace()調用加載器。我還添加了一個alert()讓用戶知道一些時髦的事情正在進行。因此,更改清單文件(我的意思是讓一些字節不同,而不是調整修改時間)會導致客戶在線時獲取新文件。

有趣的是,我注意到,在Safari中設置的localStorage不可用於調用主屏幕圖標的同一頁面,即使Cookie傳輸!因此,第一次從圖標調用引導程序時,即使它們以前在Safari中加載,它也會重新加載文件。另外,我必須顯式地阻止加載器被緩存,因爲當其他文件被更新時,不會從服務器重新加載。

2

您的清單中的網絡部分是什麼樣的?

我發現如果我不允許通配符網絡流量,它不會加載XMLHttpRequest。因此,將其更改爲:

網: *

奏效了我們。

0

你是對的。最終它是清單中的網絡部分。

我認爲加載應用程序的網站被自動包含在內,您不需要惹惱它,但這不是真的。您需要將網站放入網絡部分。