我正在将iCloud Core Data同步添加到已发布的应用中。我对默认容器和自定义容器之间的区别感到困惑。
我从测试中学到了什么:
当我使用默认容器时,我的应用程序将数据存储在iCloud中,但它不会在不同的设备上同步它。所以我假设我在iPhone(设备A)上安装了我的应用程序。当我使用默认容器时,我可以删除我的应用程序,重新安装它,执行iCLoud同步,并恢复iCloud中以前保存的数据。所以它就像在iCloud中备份一样。但是不起作用的是,它将数据从不同的设备同步,例如从iPhone(设备A)到另一台设备,例如iPad(设备B)。
当我使用自定义容器时,它会在不同设备之间同步。它的工作方式就像我希望它能够工作一样。我的数据在不同设备上同步,我在iPhone(设备A)和iPad(设备B)上拥有相同的数据。
这就是我从测试中学到的东西。但同时我的帐户似乎从所有的测试和删除以及从设备上擦除iCloud数据搞砸了,因此你不能删除容器并做一些新的安装它真的有些搞砸了。我对纪录片感到困惑。它说,如果多个应用程序共享同一容器,那么就像使用自定义容器一样。但多个应用程序是否意味着他在不同设备上的应用程或者它们是否意味着真正不同的应用程序?
我是对的吗?这是默认容器与自定义容器的区别吗?
因此,当我想在不同设备上同步相同的应用时,我必须使用自定义容器吗?
感谢您的帮助!
答案 0 :(得分:0)
我(仍有)同样的问题。我真的只需要一个容器,我的应用程序用它来在许多设备之间进行同步。使用默认(iCloud和bundleID命名容器)并使用我的设置失败同步后。我恢复了以前的测试(app之前使用过团队前缀的容器)" custom"容器,看起来我能够进行所需的所有同步测试。
结果似乎因测试设置而异(仅限设备,组合,仅限模拟器)。 iCloud测试应该始终是设备,因为它们被设置为以不同的方式行动(与模拟器不同,非贪婪)。无论如何,你想要的只是现实世界的结果。
我的有限设置包括设备上的一个(免费)应用和使用iCloud和iCloud Drive迁移帐户(iOS 8.4)的模拟器。在我的情况下进行同步是这样的:
使用默认容器iCloud。$(CFBundleIdentifier):
设备< - > iCloud(所有数据)
模拟器< - > iCloud(只能看模拟器创建的数据)
使用自定义容器$(TeamIdentifier)$(CFBundleIdentifier):
设备< - > iCloud(所有数据)
模拟器< - > iCloud(所有数据)
根据iCloud设计指南:
"当您启用iCloud Documents或CloudKit功能时,Xcode会将您的应用配置为访问名称基于应用程序包ID的iCloud容器。大多数应用程序应该只需要访问默认容器。如果您的应用程序彼此共享数据,请启用“指定自定义容器标识符”选项并添加一个或多个容器ID
您用来共享数据。当应用程序可以访问多个容器ID时,访问列表中的第一个ID是特殊的,因为它是应用程序的主要iCloud容器。"
据我了解,每个应用程序都有自己的默认容器(名称基于应用程序bundleID)。例如:
iCloud.com.company.myApp_free
iCloud.com.company.myApp_nonfree
大多数应用只访问自己的默认容器。但是,认为myApp_free和myApp_nonfree应该使用相同的容器是合理的。然后,假设免费用户开始付款,数据仍然可以访问。因此myApp_nonfree将使用付费版本容器进行无忧升级。
我怀疑它只是另一个模拟器问题。如果您使用未迁移到iCloud Drive的iCloud帐户访问(URLForUbiquityContainerIdentifier:containerIdentifier),则使用iOS 8+的模拟器将返回nil容器。