用户钥匙串的奇怪行为

时间:2012-10-13 23:50:47

标签: ios6 keychain

我正在尝试调试奇怪的行为,同时保存到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. 不会自动登录,因为它应该
  6. 上面的代码片段有问题吗?我每次都可以在模拟器上重现这个,我不知道,因为我在网上关注教程。包括以下页面:

    iOS: How to store username/password within an app?

    [编辑]

    我正在逐步通过断点,我确认在第3步(重新进入)之后,它实际上是保存到钥匙串。我能够输出它保存的内容。

    然而,在我重新启动模拟器之后......它显示它找不到用户名和密码!这毫无意义......

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。这是一个记忆问题。当屏幕移动时,keychainItem是一个被释放的属性。自从我在viewDidLoad函数中创建以来,我不得不重新初始化它,该函数在注销后没有被调用。案件结案。