如何在 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 设备 上尝试了这些步骤。 我还使用 Automatic 和 iOs Development 配置文件尝试了这些步骤。 我的应用程序包标识符是这样的:com.example.app1、com.example.app2。【讨论】:
请注意,“如您所见,我们没有指定 accessGroup。默认情况下,它会在写入时选择您的 Entitlements.plist 中指定的第一个访问组,并且在没有访问组时搜索所有访问组已指定。” @alicanbatur,太棒了!需要注意的一件事是,如果未指定“服务”,则上述过程不起作用。 你救了我很多@alicabatur。谢谢。 不适用于我我做了同样的步骤,但 [UICKeyChainStore stringForKey:@"someKey" service:@"someService"] 返回 nil以上是关于如何在 iOS 应用程序之间共享钥匙串数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的应用程序中使用 iCloud 钥匙串在不同设备的安装之间共享价值?