2

我已经在我的(现有)应用程序上工作了一段时间,以添加对 iCloud 同步的支持。总的来说,我有 3 个版本的应用程序:

a) 普通 iPhone 版
b) lite(免费)iPhone 版
c) iPad 版

我想使用 iCloud 使所有 3 个版本/设备之间的核心数据存储同步。我已经实现了,我在我的设备上放置的开发版本运行良好。

昨天我决定提交 iPhone 版本,但被拒绝了:

无效的代码签名权利 - 您的应用程序包的签名包含不受支持的权利值。对于 com.apple.developer.ubiquity-container-identifiers 权利,数组中的第一个值必须由 Apple 在配置文件中提供的前缀和捆绑标识符后缀组成。捆绑包标识符必须与您的一个应用程序或允许您用作 iCloud 容器标识符的另一个应用程序的捆绑包标识符匹配。

具体来说,不支持 [my app] 中键“com.apple.developer.ubiquity-container-identifiers”的值“[teamid].com.[myself].[somename]”。

我真的不知道这些标识符应该是什么样子。在此页面上:https ://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/iCloud/iCloud.html#//apple_ref/doc/uid/TP40007072-CH5-SW1他们说了一些关于我的其他应用程序的容器......我是否必须为我的应用程序的 3 个版本添加 3 个容器?到目前为止,我在 project/targets/summary/entitlements 下进行了配置:

[x] iCloud 键值存储:com.[myself].[somename]
iCloud 容器:com.[myself].[somename]

对于所有 3 个版本(相同的标识符)。我必须准确配置什么,以便所有 3 个版本都可以通过 iCloud 同步其核心数据存储数据库?

4

3 回答 3

2

根据iCloud 设计指南:iCloud Fundamentals,您共享 iCloud 容器的所有应用程序都可以使用单个 iCloud 容器来实现(如果您愿意的话)。这里要注意的是,主要(第一个)容器 ID 必须是您当前正在开发的应用程序的Bundle ID,或者是您之前提交的任何应用程序的 Bundle ID (共享相同的Team ID)。

我举个例子,

让我们假设您的应用程序常规 iPhone 应用程序 (a) 有一个Bundle ID com.yourteam.iphoneapp并且它是您首先提交的并且在 App Store 上可用。然后,您还必须为所有其他版本提供与主要 iCloud 容器 ID 相同的 ID。

这是上述文档中的相关部分:

在 Xcode 目标编辑器的 Summary 选项卡中,您可以请求访问应用程序所需的任意数量的 ubiquity 容器。例如,假设您提供免费和付费版本的应用。您希望升级的用户保留对其 iCloud 文档的访问权限。或者,也许您提供了两个可以互操作并需要访问彼此文件的应用程序。在这两个示例中,您通过指定一个通用的通用容器然后从每个应用程序请求访问它来获得所需的访问权限。

  1. 选择一个支持 iCloud 的应用程序作为通用无处不在容器的主要应用程序。您选择的应用程序可以是您当前正在开发的应用程序,也可以是您提交到 App Store 以供分发且其权利使用相同团队 ID 的另一个应用程序。
于 2013-08-12T10:05:57.833 回答
1

您现在可能已经解决了这个问题,但答案是您只需在所有应用程序中使用相同的通用容器标识符。你只需要一个,它不依赖于应用程序名称:注意 Apple 告诉你使用“[teamid].com.[myself].[ somename ]”而不是“[teamid].com.[myself].[ appname ]”。使用在应用程序之间一致的“某个名称”,而不是“应用程序名称”。

于 2013-02-01T15:55:34.893 回答
0

在此处输入图像描述您需要创建 3 个单独的启用 iCloud 的临时配置文件。运行相同版本应用程序的设备可以在同一个 iCloud 容器上共享数据。但是,如果您希望任何设备运行这三个应用程序版本中的任何一个来共享数据,那么您需要在每个版本的“权利”部分中添加这些标识符。

来自http://www.raywenderlich.com/6015/beginning-icloud-in-ios-5-tutorial-part-1的 iCloud 有很好的教程

编辑:

我为您的案例添加了示例图片。此外,以下文本摘自该网站上的教程:

在这里,我们使用了一种您尚未见过的新方法,称为 URLForUbiquityContainerIdentifier。此方法允许您传入容器标识符(就像您之前在 iCloud 容器部分中设置的那样),它会返回一个 URL 用于访问 iCloud 存储中的文件。

您需要在启动时为要访问的每个容器调用此方法,以授予您的应用访问 URL 的权限。如果您将 nil 传递给该方法(就像我们在这里所做的那样),它会自动返回为项目设置的第一个 iCloud 容器。由于我们只有一个容器,这使它变得又好又容易。

于 2012-04-19T19:32:15.380 回答