2012-06-15 96 views
0

我一直在寻找这个问题的解决方案,但似乎我是唯一一个在互联网上遇到过这样的问题。钥匙扣kSecValueData与最后的奇怪的不显示字符

我使用Apple提供的钥匙串包装类来存储应该存储的用户和密码。当我想获得用户价值背后,是因为这样做很容易:

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

Retriveing密码应该是作为用户名也很简单:

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

但在那之后,试图用其打印出来一个NSLog,没有任何东西显示在控制台之后。例如:

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

此的NSLog的输出是:

user: <123456>, pass: <5433 

调用[通长度]给出我总是一个数比通的实际长度的情况下(在本例中,如图10所示,当我会说它的长度实际上是4)。

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

预先感谢您!

回答

0

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

你不应该将它转换为NSString类型。 试试像这样直接发布到NSLog。

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

Goodluck!

+0

感谢您的快速回答!但我很遗憾地说它不起作用。密码后没有任何内容出现,就像以前一样:( –

2

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

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

奇迹是否有比手动解析更好的方法? – alexzg