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 说它完全是空的。

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

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

所以从表面上看,如果我登录到一个应用程序,我可以多次退出并重新启动,并且它可以完美加载。但是,一旦我登录另一个应用程序,第一个应用程序的钥匙串就会被擦除,因此它会进入登录屏幕,您尝试登录并获取新的 cookie,但随后由于无法添加钥匙串项而崩溃。修复它的唯一方法是重置模拟器。

4

1 回答 1

1

似乎您正试图在两个完全不同的设备(iphone和ipad)之间拥有一个通用的钥匙串,即使模拟器单独运行它们并且无法共享信息。

您需要将 cookie 的钥匙串或通用数据存储存储在 iCloud 之类的东西中,然后在两台设备之间同步该信息

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

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

于 2013-01-22T21:11:37.403 回答