无法读取CFPrefsPlistSource iOS 10中的值

我已经将我的Xcode 8更新到beta 2,我试图在App和Today Extension之间共享数据。 我正面临着这个日志警告:

2016-07-08 18:00:00 24.732472 ProjetctX [941:42801] [User Defaults]无法读取CFPrefsPlistSource <0x1700f1280>中的值(域:group.xpto,User:kCFPreferencesAnyUser,ByHost:Yes,Container:(null)) :将kCFPreferencesAnyUser与容器一起使用仅适用于系统容器,从cfprefsd中分离

任何人都可以帮助我?

这实际上是iOS 10和MacOS 10.12中引入的虚假警告。 (来源: https : //twitter.com/Catfish_Man/status/784460565972332544 )

预先考虑您的团队ID的build议会使警告消失,但也会创build一个新的空白用户默认值。 这将导致以前存储的数据不可读。

目前,解决scheme只是忽略它。

另外,苹果工作人员CFM 在论坛上 :

logging的消息是假的,除非你做了非常具体的事情,我不认为这是可能的,如果没有使用私人function(它被添加到误用这些function,但不幸也抓到了一个正常的使用情况)。

以下是如何使用NSUserDefaults与App Groups在您的主应用程序和您的扩展之间传递数据:

  1. 在你的主应用程序中,在Project Navigator中select你的项目。

  2. select您的主要应用程序目标,然后selectfunction选项卡。

  3. 将应用程序组开关切换到ON。 这将与Developer Portal进行通信,以生成一组权利。

  4. 创build一个新的容器。 根据苹果公司的说法,你的容器ID必须以“group”开头,所以像“group.io.intrepid.myapp”这样的名字是完美的。

  5. select您的扩展目标并重复启用应用程序组的过程。 不要创build一个新的应用程序组,只需select刚在主应用程序目标中创build的组。

  6. 在应用程序或扩展中读取或写入NSUserDefaults时,不要访问NSUserDefaults.standardUserDefaults()。 而是使用NSUserDefaults(suiteName:“group.io.intrepid.myapp”)。 注意:套件名称是在步骤4中创build的App Group容器的名称。

请确保,群组启用和使用相同的组ID为扩展和应用程序function部分!

学分转到http://blog.intrepid.io/ios-app-extensions

我正在尝试使用initWithSuiteName时遇到同样的问题。 似乎这是来自苹果的错误。 我find的唯一的解决scheme/解决方法是重置设备的所有设置。 进入设置 – >常规 – >重置 – >重置所有设置。

这不会清除iPhone上的任何内容,只会删除所有设置。 重置设置后,一切工作正常。 让我知道,如果它也帮助你。

使用Xcode 8.1 Beta构build,您将看到相同的警告,但是您也将获得该值。

如果在尝试通过使用userDefault将数据保存到扩展应用程序时遇到此问题,也许您已经编写了以下代码:

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

此代码重置默认userDefault

其实,正确的代码是:

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

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

从更改

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

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

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

在Xcode 8 GM和iOS 10 GM下testing,并且工作!