无法读取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在您的主应用程序和您的扩展之间传递数据:
-
在你的主应用程序中,在Project Navigator中select你的项目。
-
select您的主要应用程序目标,然后selectfunction选项卡。
-
将应用程序组开关切换到ON。 这将与Developer Portal进行通信,以生成一组权利。
-
创build一个新的容器。 根据苹果公司的说法,你的容器ID必须以“group”开头,所以像“group.io.intrepid.myapp”这样的名字是完美的。
-
select您的扩展目标并重复启用应用程序组的过程。 不要创build一个新的应用程序组,只需select刚在主应用程序目标中创build的组。
-
在应用程序或扩展中读取或写入NSUserDefaults时,不要访问NSUserDefaults.standardUserDefaults()。 而是使用NSUserDefaults(suiteName:“group.io.intrepid.myapp”)。 注意:套件名称是在步骤4中创build的App Group容器的名称。
请确保,群组启用和使用相同的组ID为扩展和应用程序function部分!
我正在尝试使用initWithSuiteName时遇到同样的问题。 似乎这是来自苹果的错误。 我find的唯一的解决scheme/解决方法是重置设备的所有设置。 进入设置 – >常规 – >重置 – >重置所有设置。
这不会清除iPhone上的任何内容,只会删除所有设置。 重置设置后,一切工作正常。 让我知道,如果它也帮助你。
使用Xcode 8.1 Beta构build,您将看到相同的警告,但是您也将获得该值。
如果在尝试通过使用userDefault
将数据保存到扩展应用程序时遇到此问题,也许您已经编写了以下代码:
[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];
此代码重置默认userDefault
。
其实,正确的代码是:
[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"];
从更改
[[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];
至
[[NSUserDefaults alloc] initWithSuiteName:@"nnnnnnnnnn.group.com.xxx.xxx"];
其中nnnnnnnnn
是你的团队号码,你用来签署你的代码。
在Xcode 8 GM和iOS 10 GM下testing,并且工作!