iOS でユーザーのキーチェーンに保存する際の奇妙な動作をデバッグしようとしています。以下のコードを使用して、キーチェーンにいるユーザーを確認しています。
keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:KeyName accessGroup:nil];
if(keychainItem != NULL && [keychainItem objectForKey:(id)kSecValueData] != NULL && [[keychainItem objectForKey:(id)kSecValueData] length] > 0 &&
[keychainItem objectForKey:(id)kSecAttrAccount] != NULL && [[keychainItem objectForKey:(id)kSecAttrAccount] length] > 0) {
txtPassword.text = [keychainItem objectForKey:(id)kSecValueData];
txtLogin.text = [keychainItem objectForKey:(id)kSecAttrAccount];
// Call webservice to login
[self btnPressedLogin:nil];
}
キーチェーンに保存するために次を使用しています:
[keychainItem setObject:KeyName forKey: (id)kSecAttrService];
[keychainItem setObject:txtLogin.text forKey:(id)kSecAttrAccount];
[keychainItem setObject:txtPassword.text forKey:(id)kSecValueData];
ユーザーがログアウトしたら、次のようにします。
[keychainItem resetKeychainItem];
私はそれがすべてのシナリオで機能することに気づいています:
- ログインします(ユーザー名/パスワードを手動で入力します)
- ログアウト
- ログインします(ユーザー名/パスワードを手動で入力します)
- シミュレーターを再起動する
- 必要に応じて自動ログインしません
上記のコード スニペットに何か問題がありますか? 毎回シミュレーターでこれを再現できますが、オンラインのチュートリアルに従っていたのでわかりません。次のページを含みます。
iOS: アプリ内にユーザー名/パスワードを保存する方法は?
[編集]
ブレークポイントをステップスルーしていて、ステップ 3 (再ログイン) の後、実際にキーチェーンに保存されていることを確認しました。保存したものを出力できました。
しかし、その直後にシミュレーターを再起動すると...ユーザー名とパスワードが見つからないことが示されます! これは意味がありません...