2012-06-15 4 views
0

Я искал решение этой проблемы, но, похоже, я единственный в Интернете, столкнувшийся с такой проблемой.Keychain kSecValueДата с странными не отображающимися символами наконец

Я использую класс оболочки keychain, предоставляемый 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

Смежные вопросы