钥匙串kSecValueData最后有奇怪的不显示字符

时间:2012-06-15 07:00:10

标签: objective-c ios passwords character keychain

我一直在寻找这个问题的解决方案,但似乎我是互联网上唯一遇到类似问题的人。

我正在使用Apple提供的钥匙串包装类来存储应该存储的用户和密码。当我想要获得用户价值时,就像这样做:

NSString *user = [keychain objectForKey:(id)kSecAttrAccount];

恢复密码应该与用户名一样简单:

NSString *pass = [keychain objectForKey:(id)kSecValueData];

但在那之后,尝试使用NSLog打印它们,在通过后控制台上没有显示任何内容。例如:

NSLog(@"user: <%@>, pass: <%@>, something after the pass", user, pass);

此NSLog的输出为:

user: <123456>, pass: <5433

调用[pass length]给我总是一个大于传递实际长度的数字(在这个例子中,10,当我说它的长度实际上是4时)。

我不知道发生了什么。当我尝试找到一个合适的解决方案(查看每个字符的整数值并仅允许数字,字母和一些符号)时,我做了一个解决此问题的解决方法。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

这里的问题是你试图将CFDataRef对象存储为NSString对象,然后使用%@打印它是一个字符串。它是一个数据对象,而不是一个字符串。如果您希望将其视为字符串,则必须先将其转换为字符串。在尝试记录之前尝试使用类似下面的代码将其转换为字符串:

NSData *passData = [keychain objectForKey:(id)kSecValueData];
NSString *pass = [[NSString alloc] initWithBytes:[passData bytes] length:[passData length] encoding:NSUTF8StringEncoding];

答案 1 :(得分:0)

kSecValueData的类型为:typedef const void * CFTypeRef;

您不应该将其类型化为NSString。 尝试直接将其发布到NSLog中。

NSLog(@"user <%@> pass <%@>", [keychain objectForKey:(id)kSecAttrAccount], [keychain objectForKey:(id)kSecValueData]);

古德勒克!