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 回答