我今天已将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分离
任何人都可以帮助我?
答案 0 :(得分:45)
这实际上是iOS 10和macOS 10.12中引入的虚假警告。 (来源:https://twitter.com/Catfish_Man/status/784460565972332544)
预先添加团队ID的建议会使警告静音,但也会创建一个新的空用户默认值。这将导致任何先前存储的数据不可读。
目前,解决方案只是忽略它。
此外,Apple员工CFM on the forums:
记录的消息是虚假的,除非你做了一些我认为不可能没有使用私有函数的特定事情(它被添加以捕获对这些函数的滥用,但遗憾的是还发现了一个正常的用例)。 / p>
答案 1 :(得分:10)
以下是如何将NSUserDefaults与应用程序组一起使用,以在主应用程序和扩展程序之间传递数据:
在您的主应用程序中,在Project Navigator中选择您的项目。
选择您的主应用目标,然后选择功能标签。
将App Groups开关切换为ON。这将与。沟通 Developer Portal以生成一组权利。
创建一个新容器。根据Apple的说法,您的容器ID必须是 以“group”开头,因此名称如“group.io.intrepid.myapp” 完美。
选择您的扩展程序目标并重复启用App的过程 组。不要创建新的应用程序组,只需选择该组即可 刚刚在主应用目标中创建。
在您的应用或您的应用中读取或写入NSUserDefaults时 扩展,不要访问NSUserDefaults.standardUserDefaults()。 而是使用NSUserDefaults(suiteName:“group.io.intrepid.myapp”)。 注意:套件名称是您创建的App Group容器的名称 在第4步。
请确保为扩展程序和应用程序功能部分启用并使用相同的组ID!
答案 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)
答案 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
步骤2:添加键 ApplicationGroupContainerIdentifier ,并在“签名和功能”中定义的App-Group-Id作为值设置:看起来像group.xx.yy
实施此步骤后,应用设置的默认容器现在将从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"];
答案 11 :(得分:-6)
从
改变[[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];
到
[[NSUserDefaults alloc] initWithSuiteName:@"nnnnnnnnnn.group.com.xxx.xxx"];
nnnnnnnnn
是您的团队编号,用于签署代码的编号。
在Xcode 8 GM和iOS 10 GM下测试,并且工作了!