无法读取CFPrefsPlistSource iOS 10中的值
我今天已经将我的Xcode 8更新为beta 2,我正在尝试在应用程序和today扩展之间共享数据。我面临以下日志警告: 2016-07-08 18:00:24.732472项目发送[941:42801][用户默认值]失败 要读取CFPrefsPlistSource中的值(域: group.x.p.t.o,用户:kCFPreferencesAnyUser,按主机:是,容器: (null)):仅允许将kCFPreferencesAnyUser与容器一起使用 对于系统容器,从CFSD分离 有人能帮我吗?从无法读取CFPrefsPlistSource iOS 10中的值,ios,xcode,ios10,ios-app-group,Ios,Xcode,Ios10,Ios App Group,我今天已经将我的Xcode 8更新为beta 2,我正在尝试在应用程序和today扩展之间共享数据。我面临以下日志警告: 2016-07-08 18:00:24.732472项目发送[941:42801][用户默认值]失败 要读取CFPrefsPlistSource中的值(域: group.x.p.t.o,用户:kCFPreferencesAnyUser,按主机:是,容器: (null)):仅允许将kCFPreferencesAnyUser与容器一起使用 对于系统容器,从CFSD分离 有人能帮我
[[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];
到
其中,nnnnnnnnnnnn
是您的团队编号,即您用来签署代码的编号
在Xcode 8 GM和iOS 10 GM下测试,效果良好 使用Xcode 8.1 Beta版构建,您将看到相同的警告,但您也会得到相应的值。我在尝试使用initWithSuiteName时也面临同样的问题。似乎这是苹果的一个bug。 我找到的唯一解决方案/解决方法是重置设备的所有设置。 转到设置->常规->重置->重置所有设置。 这不会擦除iPhone上的任何内容,只会擦除所有设置。
重置设置后,一切正常。如果对您也有帮助,请告诉我。这实际上是iOS 10和macOS 10.12中引入的虚假警告: NSUserDefaults提示:在当前的OSs中有一个记录的错误“…只有系统容器才允许使用容器…” 这是假的 试图捕获特定的故障模式,同时捕获正常操作情况 我在UserDefaults上的继任者也没有找到一种方法,可以在不使症状案例无法调试的情况下,使这一点不那么令人担忧:/ [线程] 预先设置团队ID的建议将使警告静音,但也将创建一个新的空用户默认值。这将导致任何以前存储的数据无法读取 就目前而言,解决办法就是忽略它 另外,苹果公司CFM的工作人员: 记录的消息是虚假的,除非你正在做一些非常具体的事情,我认为如果不使用私有函数是不可能的(添加它是为了捕捉这些函数的滥用,但不幸的是,它也捕捉到了正常的使用情况)
如果您在尝试使用
userDefault
将数据保存到扩展应用程序时遇到此问题,则可能是您编写了以下代码:
[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];
此代码重置默认值userDefault
实际上,正确的代码是:
[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"];
以下是如何在应用程序组中使用UserDefaults在主应用程序和扩展程序之间传递数据:
UserDefaults.standard
。
而是使用UserDefaults(suiteName:“group.io.intrepid.myapp”)
。
注意:套件名称是您创建的应用程序组容器的名称
在步骤4中
我的macOS应用程序也有同样的问题 解决方法:重新启动设备强>
SuiteName(后缀)不能是主捆绑包ID。将您在Xcode权限中的组名更改为:
group.com.mycompany.myapp
到
ps:您可以在developer.apple.com会员资格中找到您的MYTEAMID对于我来说,解决方案是不对应用程序包标识符和“组”后面的部分使用相同的标识符
比方说,应用程序包id为“com.app.id”,那么组id为“group.com.app.id”会导致问题。在我将其更改为“group.com.app.id.something”后,它将停止。默认情况下,如果您使用Settings.Bundle/Root.plist通过Apple Settings app显示和编辑应用程序首选项,它将使用UserDefaults.standard字典 因此,如果您正在使用应用程序组,并且希望在应用程序和扩展程序中共享此默认值/设置,则需要更改设置的容器 步骤1:打开设置。Bundle->Root.plist 步骤2:添加键ApplicationGroupContainerIdentifier,并将签名和功能中定义的应用程序组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"];
虽然设置时仍会打印相同的错误,但该值确实已设置,并且可以正确读取。但我不知道为什么会发生这种情况,这只是各种尝试的结果。我的生活中也有同样的问题app@PravinKamble我收到了这个错误,但我可以访问所有内容(用户默认的appgroup)。更改9.3上的部署目标它将在设备上完美运行,但无法与iOS 10配合使用。我将寻找解决方案,我将在找到后立即发布到此处solution@PravinKamble您是否使用Xcode 8 beta 2创建了您的项目?我使用Xcode 8 beta 4的共享默认值得到了同样的结果。我们应该使用吗“nnnnnnnn.group.com.xxx.xxx”也可以在主应用程序中写入,或者只在扩展中使用团队ID?对我来说,添加团队ID似乎是
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"];