4

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 を取得しようとしますが、キーチェーン項目を追加できないためクラッシュします。これを修正する唯一の方法は、シミュレーターをリセットすることです。

4

1 に答える 1

1

シミュレーターがそれらを別々に実行し、情報を共有できない場合でも、2 つのまったく異なるデバイス (iphone と ipad) 間で共通のキーチェーンを使用しようとしているようです。

Cookie のキーチェーンまたは共通データ ストレージを iCloud などに保存し、その情報を 2 つのデバイス間で同期する必要があります。

この記事では、共有キーチェーンに関する非常に優れた洞察を提供します。

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

于 2013-01-22T21:11:37.403 に答える