我想我找到了解決方案。它可能適用於其他人。
我將加載器分成兩個單獨的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中加載,它也會重新加載文件。另外,我必須顯式地阻止加載器被緩存,因爲當其他文件被更新時,不會從服務器重新加載。