首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS持久数据/ Settings.bundle

iOS持久数据/ Settings.bundle
EN

Stack Overflow用户
提问于 2013-07-10 00:54:01
回答 2查看 1.2K关注 0票数 1

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

例如:

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

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

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

我的问题是,在我的应用程序更新之后,我不想让用户看到"Hello Bryan !“但只有在我决定的情况下,DefaultValue才能代替(约翰)。

为了做到这一点,我考虑了这个解决方案:

代码语言:javascript
运行
复制
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。

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

小不点

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-10 17:45:35

谢谢,

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

代码语言:javascript
运行
复制
NSString *domainName = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:domainName];

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

好了!

谢谢

票数 0
EN

Stack Overflow用户

发布于 2013-07-10 01:16:51

有一个[NSUserDefaults resetStandardUserDefaults]方法可以完全删除所有存储的设置。

你关于版本控制的解决方案是完全正确的,你可以将你的应用程序版本保存在NSUserDefaults中,在每次应用程序启动时检查它,如果版本不同则进行迁移,并将当前应用程序版本存储回去。如果NSUserDefault中没有版本,那么这是一个全新的安装启动,所以您不需要做任何事情。

有一次,我不得不为版本到版本的迁移实现一个类似的机制,因为如果你更新你的应用程序超过一次,并且每次更新时都需要一些数据迁移,那么你就需要更强大的机制,而不仅仅是一个标记是否相同的标记。所以我写了两个函数来拆分和比较N个组件上的版本字符串。version_compare还可以用于NSArray排序操作,所以我基本上有一个特殊的对象,为每个版本执行数据迁移,我在寻找当前版本,对应用程序的所有已发布版本进行排序,并逐步执行迁移。

代码语言:javascript
运行
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17553898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档