2012-08-06 100 views
0

我目前正在使用Phonegap 1.4.1開發移動應用程序。在iOS上(當前使用5.1),該應用程序不會加載localStorage中的所有數據。只能部分檢索localStorage數據

第一次應用程序使用我的localStorage設置一個標誌,像這樣:

window.localStorage.setItem("myFlag", "true"); 

我還設置項「意達」,「ItemB」和「ItemC」以同樣的方式。這些鍵/值對中的每一個都在使用應用程序的過程中的不同時間設置,因此沒有設置它們的定義順序。

我的問題是這樣的:

當我重新安裝應用程序,而不先刪除現有副本,應用程序不再看到「MyFlag」,「I​​temB」或「ItemC」 - 它確實看「意達」。使用window.localStorage.length返回1,當它應該返回4.我導出應用程序的數據文件,並用SQLite Inspector(app store中的應用程序)檢查文件_0.localstorage文件,並顯示所有四個鍵/值對。

由於iOS 5.1+已將本地存儲移至Cache文件夾,因此我已按here所述實施了對file__0.localstorage文件的備份。基本上,所做的就是將localstorage db複製到應用程序暫停和退出時的Documents文件夾,然後在執行webViewDidStartLoad時返回到Cache文件夾。這部分工作正常,所以我不認爲這個過程導致問題(在我添加該過程之前,問題的症狀存在於應用程序中)。

+0

在重新安裝應用程序之前'window.localStorage.length'看起來是否正確? – 2012-08-06 15:18:48

+0

是的。打印出localStorage對象的JSON.stringified版本將顯示所有屬性。重新安裝應用程序後,只顯示「ItemA」。 – 2012-08-06 15:37:41

+0

所以這對其他人來說對我來說似乎很神祕? – 2012-08-07 12:18:43

回答

1

原來,這是Cordova(Phonegap)bug報告here的結果。所以它是Apple將文件_0.localstorage文件的位置移動到Cache目錄和蘋果錯誤的組合,其中應用程序的軟件包ID在升級到新版本的應用程序時發生了變化,並且一些.plist文件條目沒有被更改不會更新以反映新的捆綁ID。

建議的修補程序發佈爲附件here並不完美,因爲這些文件包含了引用JSONKit的引用的CDVInvokedUrlCommand。因此,下載最新的CDVInvokedUrlCommand.h和CDVInvokedUrlCommand.m以及JSONKit.h和JSONKit.m(全部來自Cordova GitHub回購)也是必要的。擬議修補程序的Phongap 1.4.1版本的README.txt文件中的代碼也包含錯誤。它說:

6)在您的應用程序的「AppDelegate.m」,這個替換你的「webViewDidStartLoad」功能:

- (void) webViewDidStartLoad:(UIWebView *)theWebView 
    { 
     static CDVLocalStorage* localStorage = nil; 
     if (localStorage == nil) { 
      localStorage = [[CDVLocalStorage alloc] initWithWebView:theWebView]; 
      [localStorage restore:nil withDict:nil]; 
     } 

     return [ super webViewDidStartLoad:theWebView ]; 
    } 

但應該說增加上述方法的身體您已經擁有此簽名的方法 - 並且行[localStorage restore:nil withDict:nil];應該更改爲[localStorage restore:nil];,因爲前面的方法簽名不存在任何位置。

當然,正確的導入也必須添加到AppDelegate.m。


升級到最新版本的Phonegap對於那些能夠這樣做的人來說是最簡單的解決方案。然而,我們正在使用(相對突然的)古老版本1.4.1和第三方插件,它與Phonegap的更新版本不兼容 - 所以這種修復方法對我們來說是最合適的。