0

我目前正在使用 Phonegap 1.4.1 开发移动应用程序。在 iOS(当前使用 5.1)上,应用程序不会从 localStorage 加载所有数据。

第一次使用该应用程序时,我在 localStorage 中设置了一个标志,如下所示:

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

我也以同样的方式设置项目“ItemA”、“ItemB”和“ItemC”。这些键/值对中的每一个都是在应用程序使用期间的不同时间设置的,因此没有定义它们的设置顺序。

我的问题是这样的:

当我重新安装应用程序时,没有先删除现有副本,应用程序不再看到“MyFlag”、“ItemB”或“ItemC”——它确实看到了“ItemA”。当它应该返回 4 时,使用window.localStorage.length返回 1。我已经导出了应用程序的数据文件并使用 SQLite Inspector(来自应用商店的应用程序)检查了 file__0.localstorage 文件,它显示了所有四个键/值对。

由于 iOS 5.1+ 已将 localstorage 移至 Cache 文件夹,因此我已经实现了 file__0.localstorage 文件的备份,如此处所述。基本上,这样做是在应用程序暂停和退出时将 localstorage db 复制到 Documents 文件夹,并在执行 webViewDidStartLoad 时复制回 Cache 文件夹。这部分工作正常,所以我不认为该程序导致了问题(在我添加该程序之前,应用程序中存在问题的症状)。

4

1 回答 1

1

这原来是此处报告的 Cordova (Phonegap) 错误的结果。因此,这是 Apple 将 file__0.localstorage 文件的位置移动到 Cache 目录和 Apple 错误的组合,在升级到应用程序的新版本时,应用程序的 Bundle ID 会发生更改,并且没有几个 .plist 文件条目'未更新以反映新的 Bundle ID。

此处作为附件发布的建议修复并不完全适用于开箱即用,因为文件包括引用了 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 和一个 3rd 方插件,它与新版本的 Phonegap 不兼容 - 所以这个修复最适合我们。

于 2012-08-10T09:18:44.127 回答