写入钥匙串失败

4
我正在开发一款iPhone和附带的iPad应用程序,使用苹果的钥匙串包装类来存储多个会话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)之间拥有一个共同的 Keychain,即使模拟器将它们分别运行并且无法共享信息。

您需要将 Keychain 或 cookie 的公共数据存储在类似 iCloud 的东西中,然后在两个设备之间同步该信息

本文提供了一些关于共享 Keychains 的非常好的见解

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接