Appleのキーチェーンラッパークラスを使用して(Railsから)複数のセッションCookieを保存するiPhoneとそれに付随するiPadアプリケーションを構築しています。
現在、シミュレーターでアプリを実行しています。1 つのアプリにログインし、シミュレーターを終了して再起動すると、キーチェーンから Cookie が正しく読み込まれ、すべて問題ありません。そして、キーチェーンデータの内容を次のようにログに記録すると:
NSLog(@"Value for keychain data: %@, l: %d", [self.keychain objectForKey:(__bridge id)(kSecValueData)], [[self.keychain objectForKey:(__bridge id)(kSecValueData)] length]);
クッキーの内容を正しく出力します。
ただし、(最初のアプリで認証した後に) 別のアプリを起動すると、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のこのコメントは、シミュレーターではこれがとにかくスキップされることを説明しています:
// シミュレーター用にビルドされたアプリは署名されていないため、シミュレーターがチェックするキーチェーン アクセス グループはありません。これは、シミュレーターで実行すると、すべてのアプリがすべてのキーチェーン項目を表示できることを意味します。
見たところ、1 つのアプリにログインすると、何度も終了して再起動することができ、完全に読み込まれます。ただし、他のアプリにログオンすると、最初のアプリのキーチェーンが消去されるため、ログイン画面に移動してログインして新しい Cookie を取得しようとしますが、キーチェーン項目を追加できないためクラッシュします。これを修正する唯一の方法は、シミュレーターをリセットすることです。