首页 文章

写入钥匙串失败

提问于
浏览
4

我正在构建一个iPhone和一个随附的iPad应用程序,它使用Apple的钥匙串包装类来存储多个会话cookie(来自Rails) .

我目前正在模拟器上运行应用程序 . 如果我登录一个应用程序,退出并重新启动模拟器,它会正确加载钥匙串中的cookie,一切都很好 . 当我记录钥匙串数据的内容时,如下所示:

NSLog(@"Value for keychain data: %@, l: %d", [self.keychain objectForKey:(__bridge id)(kSecValueData)], [[self.keychain objectForKey:(__bridge id)(kSecValueData)] length]);

它正确打印出cookie的内容 .

但是,如果我然后启动另一个应用程序(在第一个应用程序进行身份验证后),则它会在第305行崩溃:

NSAssert( result == noErr, @"Couldn't add the Keychain Item." );

输出中出现此错误:

Assertion failure in -[KeychainItemWrapper writeToKeychain], /mydirectory/Classes/Models/Keychain/KeychainItemWrapper.m:305

并且钥匙串数据的NSLog表明它完全是空的 .

钥匙串标识符对于每个应用程序都是唯一的 . 我也看了this thread - 但是我已经将访问组设置为nil,更重要的是KeychainItemWrapper中的这个注释解释了在模拟器中无论如何都会跳过:

//为模拟器构建的应用程序未签名,因此没有钥匙串访问组供模拟器检查 . 这意味着所有应用程序都可以在模拟器上运行时查看所有钥匙串项目 .

所以从外观来看,如果我登录到一个应用程序,我可以退出并重新启动多次,它可以完美地加载 . 然而,一旦我登录到另一个,第一个应用程序将其密钥链擦除,所以它进入登录屏幕,您尝试登录并获取新的cookie,但随后崩溃,因为它无法添加钥匙串项目 . 解决它的唯一方法是重置模拟器 .

1 回答

  • 1

    好像你试图在两个完全不同的设备(iphone和ipad)中使用一个共同的钥匙串,即使是模拟器单独运行它们也无法共享信息 .

    您需要在iCloud之类的内容中存储cookie的钥匙串或公共数据存储,然后在两个设备之间同步该信息

    本文提供了一些非常好的共享密钥链的洞察力

    http://shaune.com.au/ios-keychain-sharing-data-between-apps/

相关问题