我想在我的iOS应用首次启动时显示用户协议/免责声明。目前,我只是在AppDelegate中的didFinishLaunchingWithOptions中使用以下代码执行此操作:
//Show disclaimer to user, if he never agreed to it yet
if(![[NSUserDefaults standardUserDefaults] boolForKey:kHasAgreedToDisclaimerKey])
[self showDisclaimer];
但是,每次安装新版本的应用程序并首次启动时,我都需要显示新的免责声明。
我想解决这个问题的一种方法是为每个应用版本创建一个不同的UserDefaults键,但看起来它会在用户的设备上留下很多垃圾密钥。
有没有更好的方法来解决这个问题?
答案 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在评论中所述。
为了使您的信息真正持久,请在用户接受时将密钥链写入版本密钥。