共享 NSUserDefaults plist 文件?

Posted

技术标签:

【中文标题】共享 NSUserDefaults plist 文件?【英文标题】:Sharing NSUserDefaults plist file? 【发布时间】:2015-03-16 19:05:43 【问题描述】:

我想使用 NSUserDefaults 的功能来保存状态。我目前确实有这个工作。但我想复制这个 plist 文件并将其应用于另一台设备上的同一个应用程序。

有什么方法可以将文件名传递给 NSUserDefaults 还是我需要使用其他类?还是可以将 plist 与另一台设备的同一个应用共享?

device1 和 device2 上的应用是同一个应用。我不想在不同应用之间共享数据。

【问题讨论】:

【参考方案1】:

将它作为字典传递对你有用吗?

NSDictionary *dict = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];

然后在另一台设备上:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
for (NSString *key in dictionaryRepresentation.allKeys) 
    id ob = dictionaryRepresentation[key];
    [defaults setObject:ob forKey:key];

或者,您可以将dict 写入.plist 文件,将其传输过来,从.plist 解码到dict,然后按照我上面的操作。

写入.plist 文件:

[dict writeToFile:@"path/to/your/file.plist" atomically:YES];

.plist 文件中读取:

NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:@"path/to/your/file.plist"];

【讨论】:

似乎还有更多工作要做。与应用组相比,这有什么优势? 应用组对我来说意味着相同的设备,但听起来您想将数据传输到辅助设备。也许我误解了应用程序组。如果您可以跨设备共享应用组,请务必这样做,因为这可能会更容易。 我不确定应用程序组是否允许这样做。我刚刚离开了gregheo的回答。我真的找不到有关应用程序组的任何信息。您的解决方案似乎解决了将数据序列化的问题。但是它是如何传递给 device2 的呢? 对于那部分,我假设您涉及某种类型的后端,直接从应用程序到应用程序将涉及多点连接或某种蓝牙连接。如果您不做后端,我建议您使用 multipeer。不过,您必须处理权限和其他事情,所以后端可能会更容易。 有什么理由不用icloud?【参考方案2】:

如果它们都是您的应用,您可以考虑使用 app groups 让两个应用访问共享容器。在这种情况下,您将照常使用 NSUserDefaults。

否则,您无法将文件名或 URL 传递给 NSUserDefaults。您需要使用 NSDictionary + 归档自己滚动,或者只执行一次 - 即将当前默认值复制到 plist,以某种方式将其转移,然后将值写入默认值。

【讨论】:

有更多关于应用组的信息吗?搜索文档没有发现任何东西。如果 device1 向 plist 添加了一些内容并且应用程序正在 device2 上运行,那么它如何处理应用程序打开后的更新?另外,这是否使用 iCloud 将信息从设备移动到设备? 啊,我看到了对两个设备上的同一个应用程序的问题的编辑。如果在两台设备上都是同一个用户,那么如果同步是您想要的,iCloud 键/值存储将是使它们保持同步的一种解决方案。应用组更适合同一设备上的多个应用。

以上是关于共享 NSUserDefaults plist 文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 应用程序中处理数据(选择啥?NSData、CoreData、sqlite、PList、NSUserDefaults)

IOS 存储方式(PList、NSUserDefaults、归档、CoreData、数据库、文件)

如何将我的 NSUserDefaults .plist 同步到 iCloud?

将带有 NSAttributed 字符串的字典保存到 PList 或 NSUserDefaults

iOS - plist 文件、nsuserdefaults 或文本数据文件

如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?