无法读取CFPrefsPlistSource iOS 10中的值


86

我今天将Xcode 8更新为beta 2,并尝试在App和Today Extension之间共享数据。我面临着此日志警告:

2016-07-08 18:00:24.732472 ProjetctX [941:42801] [用户默认设置]无法读取CFPrefsPlistSource <0x1700f1280>中的值(域:group.xpto,用户:kCFPreferencesAnyUser,ByHost:是,容器:(空)) :仅将kCFPreferencesAnyUser与容器一起使用,与cfprefsd分离的系统容器

有人可以帮助我吗?


7
我在我的应用程序中遇到了同样的问题
Pravin Kamble 2016年

@PravinKamble我收到此错误,但是我可以访问所有内容(用户默认设置的应用程序组)。
克列维森

1
更改9.3上的部署目标后,它可以在设备上完美运行,但无法在iOS 10上运行。我会寻找解决方案,一旦找到解决方案,我就会在这里发布
Pravin Kamble

@PravinKamble您是否使用Xcode 8 beta 2创建了项目?
克列维森

我使用共享的缺省值与XCode中得到同样的事情8 beta 4版本
Gruntcakes

Answers:


76

这实际上是在iOS 10和macOS 10.12中引入的虚假警告:

NSUserDefaults提示:在当前的操作系统中,有一个已记录的错误“…只有系统容器才允许使用容器……”。

这是虚假的。

试图捕获特定的故障模式,同时捕获了正常的运行情况。

我在UserDefaults上的继任者也没有想出一种方法来减少这种警报,而又不会使有症状的情况无法调试:/

https://twitter.com/Catfish_Man/status/784460565972332544 [thread]

在您的团队ID之前添加建议将使警告静音,但也会创建一个新的空用户默认值。这将导致以前存储的任何数据都不可读。

目前,解决方案只是忽略它。

此外,苹果公司员工CFM在论坛上

除非您正在执行非常特殊的事情,否则我认为记录的消息是虚假的,如果不使用私有函数,这是不可能的(添加此消息是为了捕获对这些函数的滥用,但不幸的是,这也捕获了正常的使用情况)。


1
我试图创建一个以团队ID开头的应用程序组,但它强制它以“ group”开头。所以-这两个不应该匹配吗?
SAHM

3
我在High Sierra上看到此日志消息。在团队ID之前添加并不会为我消除警告。苹果打算解决这个问题吗?
mschmidt

1
抱歉,请您详细说明一下?“在您的团队ID前面”是什么?
Motti Shneor

19

这是将UserDefaults与App Groups结合使用的方法,用于在主应用程序和扩展程序之间传递数据:

  1. 在主应用程序中,在“项目浏览器”中选择您的项目。

  2. 选择您的主要应用目标,然后选择“功能”选项卡。

  3. 将“应用程序组”开关切换到“开”。这将与开发人员门户进行通信,以生成一组权利。

  4. 创建一个新的容器。根据Apple的说法,您的容器ID必须以“ group”开头,因此,“ group.io.intrepid.myapp”之类的名称是完美的。

  5. 选择您的扩展目标,然后重复启用应用程序组的过程。不要创建新的应用程序组,只需选择在主应用程序目标中刚刚创建的组即可。

  6. 在您的应用或扩展程序中读写UserDefaults时,请勿访问UserDefaults.standard。改为使用UserDefaults(suiteName: "group.io.intrepid.myapp")。注意:套件名称是在步骤4中创建的App Group容器的名称。

确保对扩展和应用程序功能部分进行分组启用,并使用相同的分组ID!

幸得http://blog.intrepid.io/ios-app-extensions


“仅选择在主应用程序目标中刚刚创建的组” =>未出现时该怎么办?
user3722523

启用并选择扩展名中的相同组!
阿凡·米尔扎

我重复一遍,如果扩展名中的选择为空,如何选择同一组?
user3722523

当您在“兼容性”部分下切换/启用组时,它会自动显示组列表,如果未显示,请检查团队(签署开发人员帐户),团队也需要相同!设置团队并再次切换组!
阿凡·米尔扎

它仍然不起作用...但是,对于iOS项目,它可以起作用。:我心中已经创建了一个线程stackoverflow.com/questions/44914304/...
user3722523



3

从以下位置更改Xcode权利中的组名称:

group.com.mycompany.myapp

group.MYTEAMID.com.mycompany.myapp

ps:您可以在developer.apple.com会员资格中找到您的MYTEAMID


3

对我来说,解决方案是不要对应用程序捆绑包标识符和“组”之后的部分使用相同的标识符。

假设应用程序捆绑包ID为“ com.app.id”,则组ID为“ group.com.app.id”会引起问题。将其更改为“ group.com.app.id.something”后,它停止了。


0

使用Xcode 8.1 Beta进行构建,您将看到相同的警告,但您还将获得该值。


0

我在尝试使用initWithSuiteName时遇到同样的问题。看来这是Apple的错误。我发现的唯一解决方案/解决方法是重置设备的所有设置。去设置->常规->重置->重置所有设置。

这不会删除iPhone上的任何内容,只会删除所有设置。重置设置后,一切正常。让我知道它是否也对您有帮助。


-3

如果在尝试使用来将数据保存到扩展APP时遇到此问题userDefault,则可能是您编写了以下代码:

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

此代码重置为默认值 userDefault

实际上,正确的代码是:

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

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


-10

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

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

nnnnnnnnn您的团队编号在哪里,您用来签名代码的那个。

经过Xcode 8 GM和iOS 10 GM的测试,可以正常工作!


2
我们是否也应该在主应用程序中使用“ nnnnnnnnnn.group.com.xxx.xxx”进行编写,还是仅在扩展中使用团队ID?对我来说,添加团队ID似乎会拉出一个空白的UserDeaults,而没有我保存到应用程序中“ group.com.xxx.xxx”的任何数据。确实希望对此进行修复,因为它阻止了我的iOS 10更新。
timgcarlson

2
数据仍然不同步。错误不会消失。
杰特(Jeet)2013年

3
目前看来,该错误并不影响应用。但是,如果添加团队ID,则会丢失错误,但无法获取数据。
scorpiozj

4
这不是一个好的答案。您将放置其他任何东西,并在更改密钥时跳过该错误作为帮助。
kokluch '16

在我的情况下不起作用,错误消失了,但数据没有获取
TibiaZ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.