我正在开发一款iPhone和附带的iPad应用程序,使用苹果的钥匙串包装类来存储多个会话cookie(来自Rails)。
目前我在模拟器上运行这些应用程序。如果我在一个应用程序上登录,退出并重新启动模拟器,它会正确地从钥匙串加载cookie,一切都很好。当我像这样记录钥匙串数据的内容时:
它能正确打印出cookie的内容。但是,如果我在第一个应用程序上进行身份验证后启动另一个应用程序,则会在305行崩溃。
目前我在模拟器上运行这些应用程序。如果我在一个应用程序上登录,退出并重新启动模拟器,它会正确地从钥匙串加载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,但然后崩溃,因为它无法添加密钥链项。唯一的解决方法是重置模拟器。