0

我正在将用户名/密码保存到钥匙串,如下所示:

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];

[keychainItem setObject:usernameField.text forKey:(__bridge id)(kSecAttrAccount)];
[keychainItem setObject:passwordField.text forKey:(__bridge id)(kSecValueData)];

然后我检索用户名密码:

NSString *username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
NSString *password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];

然后如果用户检查记住我,我想将它们自动放入用户名和密码登录框中:

if ([_rememberMeSwitch isOn]) {
    usernameField.text = username;
}

if ([_rememberMeSwitch isOn]) {
    passwordField.text = password;
}

这适用于用户名,但密码显然作为 nscfdata 保存在钥匙串中,因为当我尝试将密码插入 passwordField.text 时,我得到:

[__NSCFData _encodingCantBeStoredInEightBitCFString]: unrecognized selector sent to instance

我正在尝试做的只是被认为是不好的做法,还是有一种简单的方法可以解决这个问题?

4

1 回答 1

5

文档很清楚: kSecValueData 应该是 NSData / CFDataRef => 所以你必须将你的字符串转换为数据

存储它

将您的密码文本转换为 NSData

NSData *pwdData = [passwordField.text dataUsingEncoding:NSUTF8StringEncoding];

阅读它

将 NSData 转换为您的密码

NSData *pwdData = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSString *password = [[NSString alloc] initWithData:pwdData encoding:NSUTF8StringEncoding];
passwordField.text = password;
于 2014-03-08T08:15:31.090 回答