0

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];

私はそれがすべてのシナリオで機能することに気づいています:

  1. ログインします(ユーザー名/パスワードを手動で入力します)
  2. ログアウト
  3. ログインします(ユーザー名/パスワードを手動で入力します)
  4. シミュレーターを再起動する
  5. 必要に応じて自動ログインしません

上記のコード スニペットに何か問題がありますか? 毎回シミュレーターでこれを再現できますが、オンラインのチュートリアルに従っていたのでわかりません。次のページを含みます。

iOS: アプリ内にユーザー名/パスワードを保存する方法は?

[編集]

ブレークポイントをステップスルーしていて、ステップ 3 (再ログイン) の後、実際にキーチェーンに保存されていることを確認しました。保存したものを出力できました。

しかし、その直後にシミュレーターを再起動すると...ユーザー名とパスワードが見つからないことが示されます! これは意味がありません...

4

1 に答える 1

0

問題が見つかりました。メモリの問題でした。画面が移動しているときに、keychainItem割り当てが解除されていたプロパティでした。viewDidLoadログアウト後に呼び出されなかった関数で作成していたため、再初期化する必要がありました。ケースを閉じました。

于 2012-10-14T00:55:34.097 に答える