2013-07-09 106 views
1

我开发了一个应用程序,它使用Settings.bundle来允许用户更改应用程序中的某些内容。iOS持久数据/设置。捆绑

对于为例:

我受够了关键的“名字”,将默认值是“约翰”的参数。 用户可以在“设置”窗格中通过“Bryan”更改“John”,并参阅“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,我们的应用程序仍将更改的设置保留在内存中。

我希望你明白,)这是一个非常奇怪的要求:)

Pebie

+0

“真正的情况是,在我的第一个应用程序的版本有一个Settings.bundle,并在第二个版本没有。但是我们的应用程序保持更改的设置在内存中,尽管没有Settings.bundle了。”目前还不清楚,请解释第二个版本的局限性。 –

回答

0

感谢,

我关于版本的解决方案是正确的。但是当我拨打[NSUserDefaults resetStandardUserDefaults]应用程序崩溃。 相反的,我称之为:

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

然后我重新CURRENTVERSION和storedVersion为相同的值。

没关系!

感谢

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