无法读取 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"];
以下是将 UserDefaults 与应用组一起使用以在主应用和扩展程序之间传递数据的方法:
在您的主应用程序中,select您在项目导航器中的项目。
Select 您的主要应用目标并选择“功能”选项卡。
将应用程序组开关切换为打开。这将与
Developer Portal 以便生成一组权利。
创建一个新容器。根据 Apple 的说法,您的容器 ID 必须
以“group”开头,因此名称如“group.io.intrepid.myapp”是
完美。
Select 您的扩展目标并重复启用 App 的过程
团体。不要创建新的应用程序组,只需 select
刚刚在主应用程序目标中创建。
在您的应用或您的应用程序中读取或写入 UserDefaults 时
分机,不要访问 UserDefaults.standard
。
而是使用 UserDefaults(suiteName: "group.io.intrepid.myapp")
。
注意:套件名称是您创建的 App Group 容器的名称
在第 4 步中。
确保为扩展和应用功能部分启用组并使用相同的组 ID!
我的 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"];
虽然设置的时候还是会打印同样的错误,但是确实设置了值,可以正确读取。但是我不知道为什么会这样,这只是各种尝试的结果。
我今天已将我的 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"];
以下是将 UserDefaults 与应用组一起使用以在主应用和扩展程序之间传递数据的方法:
在您的主应用程序中,select您在项目导航器中的项目。
Select 您的主要应用目标并选择“功能”选项卡。
将应用程序组开关切换为打开。这将与 Developer Portal 以便生成一组权利。
创建一个新容器。根据 Apple 的说法,您的容器 ID 必须 以“group”开头,因此名称如“group.io.intrepid.myapp”是 完美。
Select 您的扩展目标并重复启用 App 的过程 团体。不要创建新的应用程序组,只需 select 刚刚在主应用程序目标中创建。
在您的应用或您的应用程序中读取或写入 UserDefaults 时 分机,不要访问
UserDefaults.standard
。 而是使用UserDefaults(suiteName: "group.io.intrepid.myapp")
。 注意:套件名称是您创建的 App Group 容器的名称 在第 4 步中。
确保为扩展和应用功能部分启用组并使用相同的组 ID!
我的 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"];
虽然设置的时候还是会打印同样的错误,但是确实设置了值,可以正确读取。但是我不知道为什么会这样,这只是各种尝试的结果。