我正在构建一个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,但随后崩溃,因为它无法添加钥匙串项目。修复它的唯一方法是重置模拟器。
答案 0 :(得分:1)
似乎你试图在两个完全不同的设备(iphone和ipad)中使用一个共同的钥匙串,即使是模拟器单独运行它们也无法共享信息。
您需要将您的cookie的钥匙串或公共数据存储存储在iCloud之类的内容中,然后在两台设备之间同步该信息
本文提供了对共享密钥链的一些非常好的见解
http://shaune.com.au/ios-keychain-sharing-data-between-apps/