无法读取CFPrefsPlistSource iOS 10

时间:2016-07-08 21:06:48

标签: ios xcode ios10 ios-app-group

我今天已将Xcode 8更新为beta 2,并且我正在尝试在App和Today Extension之间共享数据。我正面对这个日志警告:

  

2016-07-08 18:00:24.732472 ProjetctX [941:42801] [用户默认值]失败   读取CFPrefsPlistSource< 0x1700f1280>中的值(域:   group.x.p.t.o,User:kCFPreferencesAnyUser,ByHost:是的,容器:   (null)):仅允许将kCFPreferencesAnyUser与容器一起使用   对于系统容器,从cfprefsd分离

任何人都可以帮助我?

12 个答案:

答案 0 :(得分:45)

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

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

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

此外,Apple员工CFM on the forums

  

记录的消息是虚假的,除非你做了一些我认为不可能没有使用私有函数的特定事情(它被添加以捕获对这些函数的滥用,但遗憾的是还发现了一个正常的用例)。 / p>

答案 1 :(得分:10)

以下是如何将NSUserDefaults与应用程序组一起使用,以在主应用程序和扩展程序之间传递数据:

  1. 在您的主应用程序中,在Project Navigator中选择您的项目。

  2. 选择您的主应用目标,然后选择功能标签。

  3. 将App Groups开关切换为ON。这将与。沟通 Developer Portal以生成一组权利。

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

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

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

  7. 请确保为扩展程序和应用程序功能部分启用并使用相同的组ID!

    信用转到http://blog.intrepid.io/ios-app-extensions

答案 2 :(得分:4)

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

group.com.mycompany.myapp

收件人

group.MYTEAMID.com.mycompany.myapp

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

当我尝试使用initWithSuiteName时,我遇到了同样的问题。似乎这是Apple的一个错误。 我找到的唯一解决方案/解决方法是重置设备的所有设置。 转到设置 - >一般 - >重置 - >重置所有设置。

这不会删除iPhone上的任何内容,只会删除所有设置。 重置设置后,一切正常。如果它对你有帮助,请告诉我。

答案 5 :(得分:1)

我的macOS应用程序也存在同样的问题。

解决方法:重启设备!

https://stackoverflow.com/a/39876271

答案 6 :(得分:1)

SuiteName(后缀)不能是主要的捆绑包ID。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

默认情况下,如果您使用Settings.Bundle / Root.plist通过Apple Settings App显示和编辑您的应用程序首选项,它将使用 UserDefaults.standard 词典。

因此,如果您正在使用应用程序组,并且希望在应用程序和扩展程序中共享此默认设置/设置,则需要更改设置的容器。

第1步:打开您的Settings.Bundle-> Root.plist

Open Settings.Bundle -> Root.plist

步骤2:添加键 ApplicationGroupContainerIdentifier ,并在“签名和功能”中定义的App-Group-Id作为值设置:看起来像group.xx.yy

Add Key-Value pair for ApplicationGroupContainerIdentifier

实施此步骤后,应用设置的默认容器现在将从UserDefaults.standard(您的应用路径)切换到共享路径。

答案 9 :(得分:0)

以身作则

Show[T]

通过

NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];
[userDefaults setValue:@"value" forKey:@"key"]
[userDefaults synchronize]; // return maybe false, but it doesn't matter

虽然设置的时候还是会打印同样的错误,但是确实设置了值,可以正确读取。但我不知道为什么会这样,这只是各种尝试的结果。

答案 10 :(得分:-2)

如果您在尝试使用userDefault将数据保存到扩展程序APP时遇到此问题,可能您已编写此代码:

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

此代码重置默认值userDefault

实际上,正确的代码是:

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

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

答案 11 :(得分:-6)

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

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

nnnnnnnnn是您的团队编号,用于签署代码的编号。

在Xcode 8 GM和iOS 10 GM下测试,并且工作了!