繁体   English   中英

iOS永久数据/Settings.bundle

[英]iOS Persistent Data / Settings.bundle

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

举个例子 :

我有一个键为“ firstName”的参数,默认值为“ John”。 用户可以在“设置”窗格中通过“布莱恩”更改“约翰”,并查看“你好布莱恩!” 在我的应用程序中。 p!

如果用户之前未删除我的应用程序而对其进行更新,则当他再次启动应用程序时,将显示文本“ Hello Bryan!”。 还在那里。 由于MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist这是正常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,我们的应用程序仍将更改后的设置保存在内存中。

希望您能理解;)这真是一个很奇怪的要求:)

佩比

有一种方法[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;
}

谢谢,

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

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

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

没关系 !

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM