2013-07-09 104 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; 
}