1

我开发了一个应用程序,它使用 Settings.bundle 来允许用户更改应用程序中的一些内容。

举个例子 :

我有一个带有键“firstName”的参数,DefaultValue 是“John”。用户可以在“设置”窗格中将“John”更改为“Bryan”并查看“Hello Bryan!” 在我的应用程序中。一皮!

如果用户更新我的应用程序之前没有删除它,当他再次启动应用程序时,文本“Hello Bryan!” 还在那里。这是正常的,因为MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist

当用户更改数据时,它们将存储在此文件中,并将一直存储到用户从其设备中删除应用程序(不仅仅是更新)。

我的问题是,在我的应用更新后,我不希望用户看到“Hello Bryan!” 但只有在我决定时才使用 DefaultValue (John)。

为此,我考虑了这个解决方案:

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"];
}

当当前版本与存储版本不同时,我试图弄清楚如何重置此文件,但是否符合 Apple 规范? MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist

我知道这很奇怪,但我的客户不想在更新之前卸载应用程序。真正的情况是,在我的第一个应用程序版本中有一个 Settings.bundle,而在第二个版本中则没有。但是我们的应用程序将更改的设置保留在内存中,尽管不再有 Settings.bundle。

我希望你能理解;)这是一个非常奇怪的要求:)

佩比

4

2 回答 2

0

有一种方法[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;
}
于 2013-07-09T17:16:50.970 回答
0

谢谢,

我关于版本控制的解决方案是正确的。但是当我调用[NSUserDefaults resetStandardUserDefaults]应用程序崩溃时。而不是我打电话给:

NSString *domainName = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:domainName];

然后我将 currentVersion 和 storedVersion 重置为相同的值。

没关系 !

谢谢

于 2013-07-10T09:45:35.037 回答