iOS持久数据/ Settings.bundle

时间:2013-07-09 16:54:01

标签: ios objective-c settings.bundle

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

例如:

我有一个带有“firstName”键的参数,DefaultValue是“John”。 用户可以在“设置”窗格中通过“Bryan”更改“John”,并查看“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"];
}

当前版本与存储版本不同时,我试着弄清楚如何重置此文件,但是如果苹果规格可以吗? MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist

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

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

Pebie

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

谢谢,

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

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

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

没关系!

由于