我一直在寻找这个问题的解决方案,但似乎我是互联网上唯一遇到类似问题的人。
我正在使用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时)。
我不知道发生了什么。当我尝试找到一个合适的解决方案(查看每个字符的整数值并仅允许数字,字母和一些符号)时,我做了一个解决此问题的解决方法。
提前谢谢!
答案 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]);
古德勒克!