无法读取 CFPrefsPlistSource 中的值 iOS 10

Failed to read values in CFPrefsPlistSource iOS 10

我今天已将我的 Xcode 8 更新为 beta 2,我正在尝试在 App 和 Today Extension 之间共享数据。我正面临此日志警告:

2016-07-08 18:00:24.732472 ProjetctX[941:42801] [User Defaults] Failed to read values in CFPrefsPlistSource<0x1700f1280> (Domain: group.x.p.t.o, User: kCFPreferencesAnyUser, ByHost: Yes, Container: (null)): Using kCFPreferencesAnyUser with a container is only allowed for System Containers, detaching from cfprefsd

谁能帮帮我?

变化自

[[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];

[[NSUserDefaults alloc] initWithSuiteName:@"nnnnnnnnnn.group.com.xxx.xxx"]; 

其中 nnnnnnnnn 是您的团队编号,您用来签署代码的编号。

在 Xcode 8 GM 和 iOS 10 GM 下测试,成功了!

使用 Xcode 8.1 Beta 构建,你会看到同样的警告,但你也会得到值。

我在尝试使用 initWithSuiteName 时遇到了同样的问题。看来这是 Apple 的一个错误。 我找到的唯一解决方案/解决方法是重置设备的所有设置。 转到设置 -> 通用 -> 重置 -> 重置所有设置。

这不会删除 iPhone 上的任何内容,只会删除所有设置。 重置设置后,一切正常。如果对您也有帮助,请告诉我。

这实际上是 iOS 10 和 macOS 10.12 中引入的虚假警告:

NSUserDefaults tip: in the current OSs there's a logged error "…with a container is only allowed for System Containers…".

This is spurious.

Trying to catch a particular failure mode, caught a normal operation case at the same time.

My successor on UserDefaults also has not figured out a way to make this less alarming without making the symptomatic case impossible to debug :/

https://twitter.com/Catfish_Man/status/784460565972332544 [thread]

在您的团队 ID 前面添加的建议将使警告静音,但也会创建一个新的空用户默认值。这将导致任何以前存储的数据不可读。

目前解决办法就是忽略它。

此外,Apple 工作人员 CFM on the forums:

The logged message is spurious unless you're doing very specific things that I don't think are possible without using private functions (it was added to catch misuse of those functions, but unfortunately also caught a normal usage case).

如果您在尝试使用userDefault将数据保存到扩展APP时遇到此问题,可能是您编写了以下代码:

[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];

此代码重置默认值 userDefault

实际上,正确的代码是:

[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"];

http://www.jianshu.com/p/e782104c3bc3

以下是将 UserDefaults 与应用组一起使用以在主应用和扩展程序之间传递数据的方法:

  1. 在您的主应用程序中,select您在项目导航器中的项目。

  2. Select 您的主要应用目标并选择“功能”选项卡。

  3. 将应用程序组开关切换为打开。这将与 Developer Portal 以便生成一组权利。

  4. 创建一个新容器。根据 Apple 的说法,您的容器 ID 必须 以“group”开头,因此名称如“group.io.intrepid.myapp”是 完美。

  5. Select 您的扩展目标并重复启用 App 的过程 团体。不要创建新的应用程序组,只需 select 刚刚在主应用程序目标中创建。

  6. 在您的应用或您的应用程序中读取或写入 UserDefaults 时 分机,不要访问 UserDefaults.standard。 而是使用 UserDefaults(suiteName: "group.io.intrepid.myapp")。 注意:套件名称是您创建的 App Group 容器的名称 在第 4 步中。

确保为扩展和应用功能部分启用组并使用相同的组 ID!

归功于 http://blog.intrepid.io/ios-app-extensions

我的 macOS 应用程序也有同样的问题。

通过以下方式解决:重启设备!

SuiteName(后缀)不能是主要的 Bundle ID。

更改您在 Xcode 权利中的群组名称来自:

group.com.mycompany.myapp

group.MYTEAMID.com.mycompany.myapp

ps:您可以在 developer.apple.com 会员中找到您的 MYTEAMID

我的解决方案是不对应用程序包标识符和 "group." 之后的部分使用相同的标识符。

比如说,应用程序包 ID 是 "com.app.id",然后组 ID 为 "group.com.app.id" 导致了问题。在我将其更改为 "group.com.app.id.something" 后,它停止了。

默认情况下,如果您使用 Settings.Bundle/Root.plist 通过 Apple 设置应用显示和编辑您的应用首选项,它使用 UserDefaults.standard字典.

因此,如果您使用的是应用程序组,并且想在您的应用程序和扩展程序中共享此默认值/设置,则需要更改设置的容器。

第 1 步:打开您的 Settings.Bundle -> Root.plist

第 2 步:添加密钥 ApplicationGroupContainerIdentifier 并作为值设置您的 App-Group-Id,在您的签名和功能中定义:看起来像 group.xx.yy

执行此步骤后,应用程序设置的默认容器现在将从 UserDefaults.standard(您的应用程序路径)切换到共享路径。

实例设置

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];
[userDefaults setValue:@"value" forKey:@"key"]
[userDefaults synchronize]; // return maybe false, but it doesn't matter

赶快

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] init];
[userDefaults addSuiteNamed:@"group.com.xxx.xxx"];
NSString *value = [useDefaults valueForKey:@"key"];

虽然设置的时候还是会打印同样的错误,但是确实设置了值,可以正确读取。但是我不知道为什么会这样,这只是各种尝试的结果。