即使在应用更新后,持久性数据仍会导致应用崩溃

时间:2016-07-23 16:32:56

标签: ios swift persistence firebase-realtime-database

我正在使用Firebase获取数据并使用持久性来允许离线查看该数据。我的应用程序仍处于测试阶段,所以我仍然发现崩溃导致应用程序崩溃并修复它们但是当我推送新的更新时,应用程序仍会崩溃,直到我删除应用程序并重新安装新版本。例如,我有一个用户列表。如果用户注册该应用程序并且在数据库中输入错误,则应用程序的其余部分工作正常,但只有用户菜单中用户可以看到所有用户崩溃。所以我修复了错误并在TestFlight上推出了一个新版本,但即使我修复了问题,用户仍然看到崩溃。直到我删除应用程序并重新安装它才有效。

我知道这是因为我已经启用了持久性,但是有没有办法以编程方式清除内存中的内容只有在安装了新版本的应用程序时?如果我不必要,我不想告诉所有测试人员每次出现错误时都要删除并重新安装。

1 个答案:

答案 0 :(得分:0)

听起来您在新版本中更改了数据库/内容结构。因此对旧(持久)数据库/内容的读/写失败。通常,您必须定义将数据库/内容从旧版本转换为新版本的迁移规则,以便在更新后可以毫无问题地使用它。我不知道Firebase,所以我无法帮助你。

另一种方法是在新版本不兼容时删除持久数据,并在更新后直接启动清理。假设已经启动的应用程序具有版本1.0.0,您可以在应用程序流程的早期执行类似的操作:

NSString *lastKnownVersion = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastKnownAppVersion"];
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]
if (!lastKnownVersion || [currentVersion compare:newVersion options:NSNumericSearch]==NSOrderedAscending) {
    if (!lastKnownVersion) {
        // first start after update from version 1.0.0 (or lower) to a larger version
        // cleanup code here
    } else if ([lastKnownVersion compare:@"2.0.0" options:NSNumericSearch]==NSOrderedAscending) {
        // first start after update from version 1.0.1 up to 2.0.0 to a larger version
        // cleanup code here
    } // ... add more versions that need a legacy handling
    [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"LastKnownAppVersion"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}