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



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

我正在使用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)。

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

提前谢谢你!

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

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

kSecValueData 的类型: typedef const void * CFTypeRef;

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

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

祝你好运!

最新更新