NSUserDefaults是否与捆绑标识符绑定?

时间:2013-10-07 14:24:07

标签: macos cocoa

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

例如,我的1.0版捆绑包标识符为com.something,此应用已保存NSUserDefaults.standardDefaults

中的一些设置

现在稍后如果有更新,我们因某种原因需要更改包标识符,新版本是否能够访问以前版本存储的设置/首选项?

应用程序未发布APP STORE BUT具有包安装程序

2 个答案:

答案 0 :(得分:1)

如果更改捆绑包标识符,则会有一组不同的用户默认值。如果您的应用程序没有沙盒,您仍然可以读取旧的默认值。例如,如果旧的包标识符是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"];
}

答案 1 :(得分:0)

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

相关问题