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

Gto*_*heB 55 iphone shared keychain ipad ios4

我正在描述一个问题,我花了很长时间来学习答案.

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

但是,在我的应用程序中实现这一点产生了一个模糊的错误代码(永远定位)-25243,这意味着:没有访问控制.

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

Apple的文档是否无法实现完成此任务所需的内容?

Gto*_*heB 53

经过整个网络的一些(很多)挖掘后,我找到了答案.在构造KeychainItemWrapper类时使用的访问组也必须在"keychain-access-groups"部分的每个应用程序的Entitlements.plist文件中指定.

现在看来,我看到" keychain-access-groups " 几乎是显而易见的.但是,我甚至不想看那里.希望这有助于其他人.

  • 请注意,在新的XCode(4.5.2)中,设置中的应用程序摘要选项卡中存在钥匙串组的设置.您可以在那里设置组名称,但智能XCode会预先添加$(AppIdentifierPrefix),但不会在摘要中显示它.您可以在实际的plist文件中看到它并在那里进行编辑.简而言之,如果您要从摘要页面设置钥匙串组,请不要编写捆绑种子ID,XCode会自动添加它.并将其隐藏在摘要页面中,因为它是苹果软件. (4认同)
  • 我发现以下链接对于提供更多细节非常有用.http://useyourloaf.com/blog/2010/04/03/keychain-group-access.html (3认同)
  • 是否可以与其他公司共享keychain-access-groups?假设我创建了一个带有访问组的应用程序,但我希望其他公司的应用程序能够共享信息? (2认同)

ali*_*tur 14

实际上并不难做到.请按照步骤操作.

应用1:

  1. 打开应用程序的目标功能并启用KeyChain共享.
  2. 添加标识符.(例如:com.example.sharedaccess)
  3. 将" UICKeyChainStore " 添加到您的项目中.
  4. 确保您的App1项目中添加了团队ID.
  5. 将Security.framework添加到App1项目中.
  6. 并将这些代码添加到您需要的地方.

    [UICKeyChainStore setString:@"someValue" forKey:@"someKey" service:@"someService"];
    
    Run Code Online (Sandbox Code Playgroud)

应用2:

  • 打开应用程序的目标功能并启用KeyChain共享.
  • 添加标识符.(例如:com.example.sharedaccess)
  • 将" UICKeyChainStore " 添加到您的项目中.
  • 确保您的App2项目中添加了团队ID.
  • 将Security.framework添加到App2项目中.
  • 并将这些代码添加到您需要的地方.

    NSString *string = [UICKeyChainStore stringForKey:@"someKey" service:@"someService"];
    
    Run Code Online (Sandbox Code Playgroud)
  • TeamIDs应该是相同的两个项目.

  • 我在真正的iPhone设备上尝试了这些步骤.
  • 我还尝试了使用自动iOs开发配置文件的这些步骤.
  • 我的应用程序的包标识符是这样的:com.example.app1,com.example.app2.

  • 请注意"正如您所看到的,我们没有指定accessGroup.默认情况下,它会在写入时选择Entitlements.plist中指定的第一个访问组,并且在未指定任何访问组时将搜索所有访问组." (2认同)