无法读取CFPrefsPlistSource iOS 10中的值

无法读取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分离 有人能帮我

我今天已经将我的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在主应用程序和扩展程序之间传递数据:

  • 在主应用程序中,在项目导航器中选择项目

  • 选择主要应用程序目标,然后选择“功能”选项卡

  • 将“应用程序组”开关切换到“打开”。这将与 开发人员门户,以生成一组权限

  • 创建一个新容器。根据苹果的说法,你的容器ID必须 以“group”开头,这样就可以使用“group.io.intrepid.myapp”这样的名称 太好了

  • 选择扩展目标并重复启用应用程序的过程 组。不要创建新的应用程序组,只需选择 刚在主应用程序目标中创建

  • 在应用程序或应用程序中读取或写入用户默认值时 扩展名,不访问
    UserDefaults.standard
    。 而是使用
    UserDefaults(suiteName:“group.io.intrepid.myapp”)
    。 注意:套件名称是您创建的应用程序组容器的名称 在步骤4中

  • 确保对扩展和应用程序功能部分启用并使用相同的组id


    我的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"];