我已经开发了一个应用程序,它使用Settings.bundle允许用户更改应用程序中的某些内容。
例如:
我有一个键为"firstName“的参数,DefaultValue是"John”。用户可以在设置窗格中将"John“更改为"Bryan”,然后查看"Hello Bryan!“在我的应用程序中。耶!
如果用户更新我的应用程序之前没有删除它,当他将再次启动应用程序时,文本"Hello Bryan!“还在那儿。由于MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist
的原因,这是正常的
当用户更改数据时,它们将存储在此文件中,并将一直存储到用户从其设备上删除应用程序(而不仅仅是更新)。
我的问题是,在我的应用程序更新之后,我不想让用户看到"Hello Bryan !“但只有在我决定的情况下,DefaultValue才能代替(约翰)。
为了做到这一点,我考虑了这个解决方案:
NSDictionary* infoDict = [[NSBundle mainBundle] infoDictionary];
NSString* currentVersion = [infoDict objectForKey:@"CurrentSettingsVersion"];
NSString*storedVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentSettingsVersion"];
BOOL sameVersion = nil;
if([currentVersion isEqualToString:storedVersion]){
//No change keep preference
sameVersion = YES;
}else{
//Versions are different => erase prefs and set new currentSettingsVersion number
sameVersion = NO;
//Reset
[[NSUserDefaults standardUserDefaults] setValue:currentVersion forKey:@"currentSettingsVersion"];
}
当当前版本与存储的版本不同时,我试图弄清楚如何重置此文件,而是它是否符合苹果的规范??MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist
我知道这很奇怪,但我的客户不想在更新之前卸载应用程序。真正的情况是,在我的第一个应用程序版本中有一个Settings.bundle,而在第二个版本中没有。但是我们的应用程序将更改的设置保留在内存中,尽管不再有Settings.bundle。
我希望您能理解;)这是一个非常奇怪的要求:)
小不点
发布于 2013-07-10 17:45:35
谢谢,
我关于版本控制的解决方案是正确的。但是当我调用[NSUserDefaults resetStandardUserDefaults]
应用程序crash时。而不是我调用:
NSString *domainName = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:domainName];
然后我将currentVersion和storedVersion重置为相同的值。
好了!
谢谢
发布于 2013-07-10 01:16:51
有一个[NSUserDefaults resetStandardUserDefaults]
方法可以完全删除所有存储的设置。
你关于版本控制的解决方案是完全正确的,你可以将你的应用程序版本保存在NSUserDefaults中,在每次应用程序启动时检查它,如果版本不同则进行迁移,并将当前应用程序版本存储回去。如果NSUserDefault中没有版本,那么这是一个全新的安装启动,所以您不需要做任何事情。
有一次,我不得不为版本到版本的迁移实现一个类似的机制,因为如果你更新你的应用程序超过一次,并且每次更新时都需要一些数据迁移,那么你就需要更强大的机制,而不仅仅是一个标记是否相同的标记。所以我写了两个函数来拆分和比较N个组件上的版本字符串。version_compare
还可以用于NSArray排序操作,所以我基本上有一个特殊的对象,为每个版本执行数据迁移,我在寻找当前版本,对应用程序的所有已发布版本进行排序,并逐步执行迁移。
#define MAX_VERSION_DIGITS 3
static void parse_version_string(NSString* version, int(*numbers)[MAX_VERSION_DIGITS])
{
int seq[MAX_VERSION_DIGITS] = { 0, 0, 0 };
NSArray* split = [version componentsSeparatedByString:@"."];
for(int i = 0, c = MIN(MAX_VERSION_DIGITS, split.count); i < c; i++)
{
seq[i] = [[split objectAtIndex:i] intValue];
}
memcpy(numbers, &seq, sizeof(seq));
}
static NSComparisonResult version_compare(NSString* a, NSString* b)
{
int seq1[MAX_VERSION_DIGITS];
int seq2[MAX_VERSION_DIGITS];
parse_version_string(a, &seq1);
parse_version_string(b, &seq2);
for(int i = 0; i < MAX_VERSION_DIGITS; i++)
{
if(seq1[i] > seq2[i])
{
return NSOrderedDescending;
}
else if(seq1[i] < seq2[i])
{
return NSOrderedAscending;
}
}
return NSOrderedSame;
}
https://stackoverflow.com/questions/17553898
复制相似问题