Получение пароля и имени пользователя из keychainItemWrapper iOS

Я пытаюсь использовать KeychainItemWrapper.h и keychainWrapperItemWrapper.m для хранения учетных данных пользователя, таких как имя пользователя и пароль. В настоящее время я сохраняю, когда пользователь входит в систему в первый раз, например:

KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"login" accessGroup:nil];
[keychain setObject:_usernameField.text forKey:(__bridge id)kSecValueData];
[keychain setObject:_passwordField.text forKey:(__bridge id)kSecAttrAccount];

Это сохраняет значения в связке ключей. Но в следующий раз, когда пользователь откроет приложение, я хочу снова получить имя пользователя и пароль. Однако, когда я вызываю следующее:

NSString *password_ = [keychain objectForKey:(__bridge id)kSecValueData];
NSString *username_ = [keychain objectForKey:(__bridge id)kSecAttrAccount];

Кажется, я получаю странный зашифрованный ключ, такой как: <6f78696c 69676874 2d746573 74> Есть ли способ получить исходные строки для имени пользователя и пароля? Я никогда раньше не работал с брелком, буду признателен за любую помощь!


person Abhishek Ravi    schedule 16.08.2017    source источник
comment
В вашем коде нет ничего явно неправильного, хотя похоже, что где-то по пути NSString преобразуется в NSData. Значение <6f78696c 69676874 2d746573 74> является NSData эквивалентом NSString оксилайт-теста. Откуда вы взяли KeychainItemWrapper.h и как вы интегрируете его в свой проект? Вы используете CocoaPods? Какую версию Xcode вы используете? Какую версию iOS вы используете?   -  person idz    schedule 17.08.2017
comment
Вы используете это? - gist.github.com/dhoerl/1170641. Этот скрипт имеет много проблем с ним. Попробуйте что-нибудь другое: koenig-media.raywenderlich.com/uploads/2014 /12/ | github.com/vsouza/awesome-ios#keychain   -  person Lal Krishna    schedule 17.08.2017


Ответы (2)


Если вы используете указанную выше оболочку, https://koenig-media.raywenderlich.com/uploads/2014/12/KeychainWrapper.zip. Вы можете установить имя пользователя и пароль следующим образом. Я переименовал методы для myObjectForKey и mySetObject. Вы можете инициализировать

self.keychainWrapper = [[KeychainWrapper alloc] init];

в вашем методе инициализации.

//save user and password
[self.keychainWrapper setObject:username forKey:(__bridge id)kSecAttrAccount];
[self.keychainWrapper setObject:_password forKey:(__bridgeid)kSecValueData];
[self.keychainWrapper writeToKeychain];

//retrieve username and password
NSString *username = [self.keychainWrapper objectForKey:(__bridge id)kSecAttrAccount];
NSString *password = [self.keychainWrapper objectForKey:(__bridge id)kSecValueData];
person John Ottenlips    schedule 14.06.2018
comment
Это работает как шарм! - person northernman; 30.05.2021
comment
Спасибо! @нортернман - person John Ottenlips; 01.06.2021

Почему бы не использовать этот https://redflowerinc.com/keychain-wrapper-in-objective-c/

NS_ASSUME_NONNULL_BEGIN

@interface KeyChainWrapper : NSObject
+(NSMutableDictionary*) queryDictionary:(NSString*) identifier;
+(NSString*) searchKeychainCopyMatching:(NSString*) identifier;
+(bool) createKeychainValue:(NSString*) value forIdentifier:(NSString*) identifier;
+(bool) updateKeychainValue:(NSString*) password forIdentifier:(NSString*) identifier;
+(void) deleteKeychainValue:(NSString*) identifier;
@end

NS_ASSUME_NONNULL_END
person barryjones    schedule 14.07.2021