我目前正在使用Phonegap 1.4.1开发移动应用。在iOS(目前使用5.1)上,应用程序不会加载localStorage的所有数据。
第一次使用该应用时,我在localStorage中设置了一个标志,如下所示:
window.localStorage.setItem("myFlag", "true");
我也以同样的方式设置项目“ItemA”,“ItemB”和“ItemC”。在使用应用程序期间,每个键/值对都在不同的时间设置,因此没有定义它们的顺序。
我的问题是:
当我重新安装应用程序时,不首先删除现有副本,应用程序不再看到“MyFlag”,“ItemB”或“ItemC” - 它 看到“ItemA”。使用window.localStorage.length
返回1,它应该返回4.我已导出应用程序的数据文件,并使用SQLite Inspector(来自应用程序商店的应用程序)检查file__0.localstorage文件,并显示所有四个键/值对。 / p>
由于iOS 5.1+已将localstorage移动到Cache文件夹,我已按照here所述实现了file__0.localstorage文件的备份。基本上,它的作用是将localstorage db复制到app暂停和退出时的Documents文件夹,并在执行webViewDidStartLoad时复制回Cache文件夹。这部分工作正常,所以我不认为该程序导致了问题(在我添加该程序之前,应用程序中存在问题的症状)。
答案 0 :(得分:1)
结果证明这是Cordova(Phonegap)错误报告here的结果。所以它是Apple将file__0.localstorage文件的位置移动到Cache目录的组合,以及Apple升级到应用程序的新版本并且几个.plist文件条目的应用程序的Bundle ID更改的组合没有更新以反映新的Bundle ID。
作为附件here发布的建议修补程序并不是完全可行的,因为包含的文件引用了引用JSONKit的CDVInvokedUrlCommand。因此,下载最新的CDVInvokedUrlCommand.h和CDVInvokedUrlCommand.m以及JSONKit.h和JSONKit.m(全部来自Cordova GitHub repo)也是必要的。 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不兼容 - 所以这个修复最适合我们。