如何检查应用程序的当前版本之前是否已启动?

时间:2014-12-09 20:42:21

标签: ios nsuserdefaults

我想在我的iOS应用首次启动时显示用户协议/免责声明。目前,我只是在AppDelegate中的didFinishLaunchingWithOptions中使用以下代码执行此操作:

//Show disclaimer to user, if he never agreed to it yet
 if(![[NSUserDefaults standardUserDefaults] boolForKey:kHasAgreedToDisclaimerKey])
      [self showDisclaimer];

但是,每次安装新版本的应用程序并首次启动时,我都需要显示新的免责声明。

我想解决这个问题的一种方法是为每个应用版本创建一个不同的UserDefaults键,但看起来它会在用户的设备上留下很多垃圾密钥。

有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:4)

关闭。不要为每个应用版本保存一些内容,只需存储上次打开的应用版本并将其与当前应用版本进行比较。像这样:

//Get the last opened and current versions
NSString *lastOpenedV = [[NSUserDefaults standardUserDefaults] objectForKey:@"LastOpenedVersion"];
NSString *currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

//Show an alert if necessary
if (lastOpenedV == nil || ![lastOpenedV isEqualToString:currentVersion]) {

    [self showDisclaimer];

    //Update the last opened version
    [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"LastOpenedVersion"];
}

答案 1 :(得分:1)

听起来你有正确的想法。

我会尝试这样的事情:

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSString *storedVersion = [prefs objectForKey:@"AppVersion"];

    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
    NSString *bundleVersion = [infoDict objectForKey:@"CFBundleVersion"];

    if (storedVersion) {
        if (![storedVersion isEqualToString:bundleVersion]) {
            [prefs setObject:bundleVersion forKey:@"AppVersion"];
            [prefs synchronize];

            // Show disclaimer
        }
    } else {
        [prefs setObject:bundleVersion forKey:@"AppVersion"];
        [prefs synchronize]; 
   }

基本上,您要将捆绑包版本复制到userDefaults,并在每次启动时进行比较。如果默认情况下不存在,则表示您刚刚安装了该应用,并且您希望显示免责声明。如果它是默认值,那么您要根据捆绑包版本进行检查。只要捆绑版本不匹配,您就知道该应用已更新。

编辑:看起来花了太长时间来模拟我的例子。我已经晚了十分钟,你找到了答案。但无论如何我会留在这里:)。

答案 2 :(得分:0)

当应用程序被删除时,NSUserdefaults将被删除,但数据将在更新时保留。如果您没问题,可以在那里保存可接受版本的版本号,如@Nick在评论中所述。
为了使您的信息真正持久,请在用户接受时将密钥链写入版本密钥。