Брелок 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

Вызов [длина прохода] всегда дает мне число, превышающее фактическую длину прохода (в этом примере 10, когда я бы сказал, что его длина на самом деле равна 4).

Я понятия не имею, что происходит. Я сделал обходной путь, чтобы исправить эту проблему, пока я пытаюсь найти правильное решение (просматривая целочисленное значение каждого символа и разрешая только те, которые являются числами, буквами и некоторыми символами).

Заранее спасибо!


person Andrés    schedule 15.06.2012    source источник


Ответы (2)


Проблема здесь в том, что вы пытаетесь сохранить объект CFDataRef как объект NSString, а затем распечатать его как строку с помощью% @. Это объект данных, а не строка. Если вы хотите видеть его как строку, вы должны сначала преобразовать его в строку. Попробуйте что-то вроде приведенного ниже кода, чтобы преобразовать его в строку, прежде чем пытаться регистрировать его:

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

kSecValueData имеет тип: typedef const void * CFTypeRef;

Вы не должны приводить его к NSString. Попробуйте напрямую опубликовать его в NSLog вот так.

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

Удачи!

person Leon    schedule 15.06.2012
comment
Спасибо за Ваш быстрый ответ! Но мне жаль, что это не работает. После пароля ничего не появляется, как и раньше :( - person Andrés; 15.06.2012