4

我想知道是否NSUserDefaults绑定到捆绑标识符?

例如,我有 1.0 版的捆绑标识符,com.something并且这个应用程序将一些设置保存在NSUserDefaults.standardDefaults

现在一段时间后,如果更新到来并且由于某种原因我们需要更改捆绑标识符,新版本是否能够访问先前版本存储的设置/首选项?

该应用程序未发布 APP STORE 但有包安装程序

4

2 回答 2

2

如果您更改捆绑标识符,您将拥有一组不同的用户默认值。如果您的应用程序没有被沙盒化,您仍然可以阅读旧的默认设置。例如,如果您的旧捆绑包标识符是 com.company.aaa,您可以使用以下代码在应用程序启动时将旧默认值复制到新应用程序+捆绑包标识符:

// Read the old defaults from com.company.aaa
NSUserDefaults *oldDefaults = [NSUserDefaults new];
NSDictionary *oldDefaultsDict = [oldDefaults persistentDomainForName:@"com.company.aaa"];

// Store the old defaults in the standard user defaults
[[NSUserDefaults standardUserDefaults] setPersistentDomain:oldDefaultsDict forName:[[NSBundle mainBundle] bundleIdentifier]]];

您可能希望存储一个默认标志以指示您已经导入了一次旧默认值,以避免随后重写它们。例如:

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
if (! [currentDefaults boolForKey:@"importedOldDefaultsFromAAA"]) {
    // Read the old defaults from com.company.aaa
    NSUserDefaults *oldDefaults = [NSUserDefaults new];
    NSDictionary *oldDefaultsDict = [oldDefaults persistentDomainForName:@"com.company.aaa"];

    // Store the old defaults in the standard user defaults
    [currentDefaults setPersistentDomain:oldDefaultsDict forName:[[NSBundle mainBundle] bundleIdentifier]]];

    // Set the flag to avoid subsequent import of old defaults
    [currentDefaults setBool:YES forKey:@"importedOldDefaultsFromAAA"];
}
于 2013-10-07T14:42:08.507 回答
0

我会说是的,因为用户默认值存储在~/Library/Preferences/com.domain.appname.plist(或者如果应用程序是沙盒的~/Library/Containers/com.domain.appname/Data/Library/Preferences/com.domain.appname.plist)。

于 2013-10-07T14:27:00.317 回答