【问题标题】:iCloud entitlements rejectediCloud 权利被拒绝
【发布时间】:2012-04-19 18:17:40
【问题描述】:

我已经在我的(现有)应用程序上工作了一段时间,以添加对 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]”。 em>

我真的不知道这些标识符应该是什么样子。在此页面上: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 同步它们的核心数据存储数据库?

【问题讨论】:

  • 在支持 iCloud 的同时,我们应该在现有的工作应用 ID 中启用 iCloud,还是应该在启用 iCloud 的情况下创建新的应用 ID?

标签: ios core-data ios5 icloud entitlements


【解决方案1】:

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

我举个例子,

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

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

在 Xcode 目标编辑器的 Summary 选项卡中,您可以请求访问权限为 您的应用程序需要的许多无处不在的容器。例如,说 您提供免费和付费版本的应用程序。你想要用户,他们 升级,以保留对其 iCloud 文档的访问权限。或者,也许你 提供两个可以互操作并需要访问彼此的应用程序 文件。在这两个示例中,您都可以通过以下方式获得所需的访问权限 指定一个通用的泛在容器,然后请求访问 它来自每个应用程序。

  1. 选择一个支持 iCloud 的应用程序作为通用 ubiquity 容器的主要应用程序。您选择的应用程序可以是当前的 您正在开发的应用程序,或您提交的另一个应用程序 在 App Store 中分发并且其权利使用同一团队 身份证。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的信息。我实际上放弃了 iCloud 同步,看到这么多开发人员仍然面临使用 coredata/icloud 的同步问题。我不确定是否以及何时开始另一次尝试,但如果我这样做了,我一定会记住您的建议。
    • 感谢您的澄清,我实际上会朝着这个方向前进,以便让我的类似应用在它们之间共享用户创建的文档。
    【解决方案3】:

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

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

    已编辑:

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

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

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

    【讨论】:

    • 恐怕我还是没明白。我确实有 3 个单独的配置文件,全部用于他们自己的启用了 iCloud 的应用程序 ID。 d1xzuxjlafny7l.cloudfront.net/wp-content/uploads/2011/10/… 我必须把什么作为键值存储?供应门户中相应版本的 XXXXXXXX.com.myself.appname 字符串?或者只是 com.myself.appname 如教程中所示?容器呢? com.myself.appname 的其他版本? (共 3 个)我想知道我们如何能够同步我的开发版本。在所有版本中,我基本上与 tut 中的相同。
    • 谢谢,现在更清楚了。您放入图片中的键必须与我的应用程序的捆绑标识符相对应,或者这可以是任意名称吗?另外,如何确保核心数据存储已同步?我需要将容器密钥之一传递给 NSPersistentStoreCoordinator 选项。这将是 3 个版本的 3 个不同选项,还是将相同的容器 ID 传递给所有 3 个 NSPersistentStoreCoordinator (iphone/lite/ipad)?我的意思是,这 3 个容器会自动同步,还是我必须选择 1 个容器在 3 个设备之间共享?
    • 我确信即使来自同一开发者,iCloud 也不会跨容器自动同步。您可能必须手动或使用单容器方法来完成。我没有做过这些东西,所以不能帮你。试试谷歌?
    • 第一天(ios/mac 应用程序)进行 icloud 同步,我为他们的应用程序找到了 1 个容器。我的 ipad 和 mac(图书馆/移动文档)上的相同容器文件夹名称。我认为这就是重点,您可以授予从其他应用程序访问您的 icloud 同步的权限?
    猜你喜欢
    • 2012-08-27
    • 2019-02-26
    • 2015-08-30
    • 2014-08-10
    • 2018-07-19
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多