如果您有不同的捆绑种子 ID(捆绑标识符前面的十个字母数字字符,即 中的 X XXXXXXXXXX.com.company.application
),则无法共享访问组。这是对 Apple 的限制,不允许绕过它。我建议您找到另一种安全共享数据的解决方案(可能在设备外部,在服务器上,但不是 iCloud,因为它具有相同的限制)。
有关钥匙串访问组的一般信息:
从 iPhone OS 3.0 开始,可以在一系列应用程序之间共享数据。如果您遵循免费/高级应用程序的通用路径,或者您有一组需要共享一些通用帐户设置的相关应用程序,这可以提供更好的用户体验。
共享钥匙串访问的主要先决条件是所有应用程序都有一个共同的捆绑种子 ID。要清楚这意味着什么,请记住 App ID 由两部分组成:
<Bundle Seed ID> . <Bundle Identifier>
捆绑种子 ID 是 Apple 在您首次创建 App ID 时生成的唯一(在 App Store 中)十个字符的字符串。捆绑标识符通常设置为标识您的应用程序的反向域名字符串(例如com.yourcompany.appName
),并且是您在 Xcode 中的应用程序 Info.plist 文件中指定的内容。
因此,当您想要创建一个可以与现有应用程序共享钥匙串访问权限的应用程序时,您需要确保使用现有应用程序的捆绑种子 ID。当您在 iPhone Provisioning Portal 中创建新的 App ID 时,您会执行此操作。您可以从所有以前的捆绑种子 ID 列表中选择现有值,而不是生成新值。
需要注意的是,虽然您可以为捆绑标识符创建一个带有通配符的配置文件,但我从未能够在使用它的应用程序之间实现共享钥匙串访问。它适用于完全指定的(无通配符)标识符。由于许多其他 Apple 服务(例如推送通知和应用内购买)也有此限制,因此这可能不足为奇,但我还没有找到有关钥匙串访问的文档。
一旦你用一个通用的捆绑种子 ID 设置了你的配置文件,剩下的就很容易了。您需要做的第一件事是注册您要使用的钥匙串访问组。钥匙串访问组几乎可以命名为任何您想要的名称,只要它以捆绑种子 ID 开头即可。例如,如果我有两个应用程序如下:
ABC1234DEF.com.useyourloaf.amazingApp1
ABC1234DEF.com.useyourloaf.amazingApp2
我可以定义一个通用的钥匙串访问组,如下所示:
ABC1234DEF.amazingAppFamily
要使应用程序能够访问该组,您需要使用 xCode 将权利 plist 文件添加到项目中。使用 Add -> New File 并从 iPhone OS Code Signing 部分选择 Entitlements 模板。您可以将文件命名为您喜欢的任何名称(例如KeychainAccessGroups.plist
)。在文件中添加一个名为 keychain-access-groups 的新数组项,并使用我们选择的钥匙串访问组的值在数组中创建一个项:
注意:请勿更改权利文件中默认创建的 get-task-allow 项,除非您正在创建应用程序的 Ad-Hoc 分发(在这种情况下,您应该取消选中此选项)。
应该对共享捆绑种子 ID 的所有应用程序重复相同的过程,以使它们能够访问钥匙串组。要从该组中实际存储和检索值,需要向作为参数传递给钥匙串服务的字典添加一个附加值。使用上一篇文章中关于简单 iPhone 钥匙串访问的示例,搜索字典会获得以下附加项:
[searchDictionary setObject: @"ABC1234DEF.amazingAppFamily" forKey: (id)kSecAttrAccessGroup];
最后一条评论,使用共享的钥匙串访问组也不会阻止您将值存储在应用程序的私有钥匙串中。Apple GenericKeychain 示例应用程序构建了两个应用程序,它们都将数据存储在私有和组密钥链中。
资料来源:用你的面包