如何在 iOS 应用程序之间共享钥匙串数据

Posted

技术标签:

【中文标题】如何在 iOS 应用程序之间共享钥匙串数据【英文标题】:How to share keychain data between iOS applications 【发布时间】:2011-05-06 04:05:02 【问题描述】:

我正在描述一个我花了很长时间才知道答案的问题。

“GenericKeychain”示例是在 init 中使用 accessGroup 时提供用于在应用程序之间共享钥匙串数据的包装器的良好开端。

但是,在我的应用中实现这一点会产生一个模糊的错误代码(需要很长时间才能找到)-25243,这意味着:没有访问控制。

我在我的 iPad 上运行 Apple 的示例应用程序 (GenericKeychain) 只是为了得到同样的错误。嗯?

Apple 的文档是否未能提供完成此操作所需的内容?

【问题讨论】:

@GtotheB,很好的答案!如果需要,请将您的答案与问题分开,并将其作为该问题的“答案”发布。 @GtotheB:当您尝试发布答案时发生了什么?可能需要最低声誉,但如果是这样,我不知道。如果是这种情况,值得在获得更多代表后回到这个问题并发布答案。 @GtotheB:你现在能回答你自己的问题吗? 点击“回答”没有任何结果。但是,这似乎与声誉有关。我已经清除了我所有的 cookie 并失去了我以前的所有代表,所以我似乎从头开始。现在答案是分开的。干杯。 是否有必要将应用上传到应用商店,以便在应用之间通过钥匙串共享数据。我们如何检查这一点以用于我们的开发目的。 【参考方案1】:

在网络上进行了一些(很多)挖掘之后,我找到了答案。您在构建 KeychainItemWrapper 类时使用的访问组也必须在“keychain-access-groups”部分的每个应用程序的 Entitlements.plist 文件中指定。

现在我看到“keychain-access-groups”似乎很明显。然而,我什至不知道去那里看。希望这对其他人有所帮助。

【讨论】:

我发现以下链接对于提供更多详细信息非常有用。 useyourloaf.com/blog/2010/04/03/keychain-group-access.html 请注意,在新的 XCode (4.5.2) 中,在设置的应用摘要选项卡中有钥匙串组的设置。您可以在那里设置组名,但智能 XCode 会在 $(AppIdentifierPrefix) 前面添加但不会在摘要中显示它。您可以在实际的 plist 文件中看到它并在那里进行编辑。简而言之,如果您从摘要页面设置钥匙串组,请不要编写捆绑种子 ID,XCode 会自动添加它。并将其隐藏在摘要页面中,因为它是苹果软件。 我有一个后续问题:您的应用是否具有相同的捆绑包/开发者种子 ID?或者您只是使用 Entitlements.plist 在钥匙串组之间共享数据? 是否可以与另一家公司共享钥匙串访问组?假设我创建了一个具有访问权限组的应用程序,但我希望其他公司的应用程序也能够共享信息? 如果有人仍然遇到错误 -25243 的问题并尝试在多个应用程序之间共享相同的钥匙串,对我有用的是在权利 plist 文件中设置硬编码的钥匙串种子 ID,而不是 $(AppIdentifierPrefix ) 被 XCode [url=postimg.org/image/52m2p4aor/][img=http://s9.postimg.org/… 自动附加【参考方案2】:

其实做起来也不难。请按照步骤操作。

应用1:

    打开您应用的目标功能并启用钥匙串共享。 添加标识符。 (例如:com.example.sharedaccess) 将“UICKeyChainStore”添加到您的项目中。 确保您已将团队 ID 添加到您的 App1 项目中。 将 Security.framework 添加到您的 App1 项目中。

    并将这些代码添加到您需要的地方。

    [UICKeyChainStore setString:@"someValue" forKey:@"someKey" service:@"someService"];
    

应用程序2:

打开您应用的目标功能并启用钥匙串共享。 添加标识符。 (例如:com.example.sharedaccess) 将“UICKeyChainStore”添加到您的项目中。 确保您已将团队 ID 添加到您的 App2 项目中。 将 Security.framework 添加到您的 App2 项目中。

并将这些代码添加到您需要的地方。

NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"];

两个项目的 TeamIDs 应该相同。

我在真正的 iPhone 设备 上尝试了这些步骤。 我还使用 AutomaticiOs Development 配置文件尝试了这些步骤。 我的应用程序包标识符是这样的:com.example.app1、com.example.app2。

【讨论】:

请注意,“如您所见,我们没有指定 accessGroup。默认情况下,它会在写入时选择您的 Entitlements.plist 中指定的第一个访问组,并且在没有访问组时搜索所有访问组已指定。” @alicanbatur,太棒了!需要注意的一件事是,如果未指定“服务”,则上述过程不起作用。 你救了我很多@alicabatur。谢谢。 不适用于我我做了同样的步骤,但 [UICKeyChainStore stringForKey:@"someKey" service:@"someService"] 返回 nil

以上是关于如何在 iOS 应用程序之间共享钥匙串数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的应用程序中使用 iCloud 钥匙串在不同设备的安装之间共享价值?

NSSecureCoding 与钥匙串

将钥匙串共享添加到已有用户的生产应用程序

启用钥匙串共享会改变您的 AppID 吗?

我们可以访问在共享同一应用组的应用启用钥匙串共享之前保存的钥匙串项目吗?

如何以编程方式将证书导入我的iOS应用程序的钥匙串,并在需要时将身份传递给服务器?