作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的。我在 View Controller 中设置用户密码:
KeychainItemWrapper *keychainWrapper =
[[KeychainItemWrapper alloc] initWithIdentifier:
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"] accessGroup:nil];
[keychainWrapper setObject:@"theUser" forKey:(__bridge id)(kSecAttrAccount)];
[keychainWrapper setObject:_passcode forKey:(__bridge id)(kSecValueData)];
NSLog(@"Saved pass: %@",_passcode);
NSLog(@"Returned pass: %@",[keychainWrapper objectForKey:(__bridge id)(kSecValueData)]);
NSlogs 返回我设置的相同字符串,假设它是 1234。稍后在 AppDelegate 中我尝试检索密码:
KeychainItemWrapper *keychainWrapper =
[[KeychainItemWrapper alloc] initWithIdentifier:
[[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleIdentifier"] accessGroup:nil];
passcodeViewController.passcode = [keychainWrapper objectForKey:(__bridge id)(kSecValueData)];
NSLog(@"Pass: %@",[keychainWrapper setObject:_passcode forKey:(__bridge id)(kSecValueData)]);
然后邪恶就来了。 NSLog 返回:31323334。我做错了什么?
最佳答案
Keychain 将密码存储为 NSData
,而不是 NSString
。在存储密码之前,您需要对其进行编码。
NSData * passcodeData = [_passcode dataUsingEncoding:NSUTF8StringEncoding];
[keychainWrapper setObject:passcodeData forKey:(__bridge id)(kSecValueData)];
同样,检索到的对象是您需要解码的NSData
。
NSData * passcodeData = [keychainWrapper objectForKey:(__bridge id)(kSecValueData)];
passcodeViewController.passcode = [[NSString alloc] initWithBytes:[passcodeData bytes]
length:[passcodeData length]
encoding:NSUTF8StringEncoding];
关于iOS,钥匙串(keychain) : Wrong passcode output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24390009/
我是一名优秀的程序员,十分优秀!