我想知道 NSUserDefaults 是否与捆绑标识符相关联?

例如,我有 1.0 版的包标识符是 com.something,这个应用程序在 NSUserDefaults.standardDefaults 中保存了一些设置

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

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

最佳答案

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

关于macos - NSUserDefaults 是否与包标识符相关联?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19227342/

10-11 22:56
查看更多