iCloud 容器默认 vs 自定义

Posted

技术标签:

【中文标题】iCloud 容器默认 vs 自定义【英文标题】:iCloud container default vs custom 【发布时间】:2015-03-02 02:13:56 【问题描述】:

我正在将 iCloud Core Data 同步添加到已发布的应用程序中。我对默认容器和自定义容器之间的区别感到困惑。

我从测试中学到了什么:

当我使用默认容器时,我的应用程序将数据存储在 iCloud 中,但不会在不同设备之间同步。因此,假设我在 iPhone(设备 A)上安装了我的应用程序。当我使用默认容器时,我可以删除我的应用程序,重新安装它,进行 iCLoud 同步并恢复之前保存在 iCloud 中的数据。所以它就像 iCloud 中的备份一样工作。但不起作用的是,它将数据跨不同设备同步,例如从 iPhone(设备 A)到另一设备,例如 iPad(设备 B)。

当我改用自定义容器时,它会在不同设备之间同步。它就像我希望它工作一样工作。我的数据在不同的设备上同步,我在 iPhone(设备 A)和 iPad(设备 B)上拥有相同的数据。

这是我从测试中学到的。但与此同时,我的帐户似乎真的因为所有的测试以及从设备上删除和擦除 iCloud 数据而变得一团糟,因为你不能删除容器并进行全新的安装,所以它真的有点搞砸了。我对纪录片感到困惑。它说如果多个应用程序共享同一个容器,则使用自定义容器。但是多个应用程序是否意味着他在不同设备上的同一个应用程序?或者它们是指真正不同的应用程序?

我说的对吗?这就是默认容器和自定义容器的区别吗?

所以当我想在不同设备上同步同一个应用时,我必须使用自定义容器吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我有(仍然有)同样的问题。我真的只需要一个容器,我的应用程序使用它来在许多设备之间进行同步。在使用默认(iCloud 和 bundleID 命名容器)并与我的设置同步失败后。我恢复到测试以前的(应用程序之前使用了团队前缀容器)“自定义”容器,看起来我能够进行我需要的所有同步测试。

结果似乎因测试设置而异(仅限设备、组合、仅限模拟器)。 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 容器。

【讨论】:

以上是关于iCloud 容器默认 vs 自定义的主要内容,如果未能解决你的问题,请参考以下文章

vs2008时间控件设置默认值

自定义控件VS用户控件

C# 自定义控件VS用户控件

选择行时启用自定义按钮(默认禁用)

我们可以用angular中的自定义css覆盖选择器的默认样式吗

自定义控件事件