0

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

我正在使用 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] 总是给我一个大于 pass 实际长度的数字(在这个例子中,10,当我说它的长度实际上是 4)。

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

先感谢您!

4

2 回答 2

1

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

NSData *passData = [keychain objectForKey:(id)kSecValueData];
NSString *pass = [[NSString alloc] initWithBytes:[passData bytes] length:[passData length] encoding:NSUTF8StringEncoding];
于 2012-10-22T18:41:49.427 回答
0

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

您不应该将其类型转换为 NSString。尝试像这样直接将其发布到 NSLog 中。

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

祝你好运!

于 2012-06-15T08:14:27.377 回答