У меня есть экран входа в моем приложении iOS. Имя пользователя и пароль будут сохранены в NSUserDefaults
и снова загружены в экран входа в систему при повторном входе в приложение (конечно, NSUserDefaults
постоянные).
Теперь у пользователя есть возможность отключить функцию сохранения имени пользователя / пароля.
Таким образом, NSUserDefaults
будет очищен тогда.
Но в моем приложении мне нужно это имя пользователя / пароль для запросов к базе данных для пользователя. Итак: где хранить данные кроме NSUserDefaults
? (Это место можно / нужно удалить, когда пользователь выйдет из приложения или выйдет из системы).
Ответы:
Вы всегда должны использовать связку ключей для хранения имен пользователей и паролей, и, поскольку они хранятся надежно и доступны только для вашего приложения, нет необходимости удалять их при выходе из приложения (если это было вашей проблемой).
Apple предоставляет пример кода, который хранит, считывает и удаляет элементы цепочки для ключей, и вот как использовать класс оболочки цепочки для ключей из этого примера, что значительно упрощает использование цепочки для ключей.
Включите Security.framework (в Xcode 3 щелкните правой кнопкой мыши папку фреймворков и добавьте существующий каркас. В Xcode 4 выберите свой проект, затем выберите цель, перейдите на вкладку «Фазы сборки» и нажмите «+» в разделе «Связать двоичные файлы с файлами») и KeychainItemWrapper .h &. m файлов в ваш проект, # импортируйте файл .h везде, где вам нужно использовать цепочку для ключей, а затем создайте экземпляр этого класса:
( YourAppLogin может быть любым, что вы выбрали для вызова элемента Keychain, и вы можете иметь несколько элементов при необходимости)
Затем вы можете установить имя пользователя и пароль, используя:
Получить их с помощью:
Или удалите их, используя:
источник
kSecValueData
иkSecAttrAccount
в коде Objective-C, поэтому обязательно приведите их, используя(__bridge id)
, например,[keychainItem setObject:obj forKey:(__bridge id)kSecValueData];
Если вам нужна версия ARC обертки здесь ссылка https://gist.github.com/1170641 Благодаря
источник
Очень простое решение с помощью брелков .
Это простая оболочка для системы Keychain. Просто добавьте
SSKeychain.h
,SSKeychain.m
,SSKeychainQuery.h
иSSKeychainQuery.m
файлы в свой проект и добавить Security.framework к вашей цели.Чтобы сохранить пароль:
Чтобы восстановить пароль:
Где
setPassword
находится то значение, которое вы хотите сохранить, иforService
какая переменная, под которой вы хотите сохранить, и учетная запись для какого пользователя / объекта пароль и любая другая информация.источник
NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"]
. Это должно работать нормально, если вы используете только одну учетную запись. Как всегда, не забудьте проверить длину массива, прежде чем пытаться получить доступ к индексу 0.Вы можете просто использовать
NSURLCredential
, он сохранит имя пользователя и пароль в цепочке для ключей всего в двух строках кода .Смотрите мой подробный ответ .
источник
Я решил ответить, как использовать связку ключей в iOS 8, используя Obj-C и ARC.
1) Я использовал keychainItemWrapper (версия ARCifief) из GIST: https://gist.github.com/dhoerl/1170641/download - добавьте (+ скопируйте) KeychainItemWrapper.h и .m в ваш проект
2) Добавьте каркас безопасности в ваш проект (проверьте в проекте> Фазы сборки> Связать бинарный файл с библиотеками)
3) Добавьте библиотеку безопасности (#import) и KeychainItemWrapper (#import "KeychainItemWrapper.h") в файлы .h и .m, где вы хотите использовать цепочку ключей.
4) Чтобы сохранить данные в связку ключей:
5) Считать данные (возможно, экран входа в систему при загрузке> viewDidLoad):
Наслаждайтесь!
источник
Если у вас возникли проблемы с получением пароля с помощью оболочки ключей, используйте этот код:
источник
зацените этот пример кода, я сначала попробовал оболочку яблока из примера кода, но для меня это намного проще
источник
Попробуй это:
может это поможет.
источник
Я смотрел на использование KeychainItemWrapper (версия ARC), но я не нашел его обертку Objective C настолько полезной, насколько хотелось.
Я использовал это решение от Kishikawa Katsumi , что означало, что я написал меньше кода и мне не пришлось использовать приведения для хранения значений NSString.
Два примера хранения:
Два примера получения
источник
В приведенном выше коде есть небольшая ошибка (кстати, Дэйв, это было очень полезно, ваш пост, спасибо)
В той части, где мы сохраняем учетные данные, для правильной работы также необходим следующий код.
наиболее вероятно, потому что во второй раз, когда мы пытаемся (повторно) войти в систему с теми же учетными данными, он находит их уже назначенными в элементах цепочки для ключей, и приложение вылетает. с приведенным выше кодом это работает как шарм.
источник
Чтобы обновить этот вопрос:
Для тех, кто использует Swift checkout, эта реализация Swift перетаскивания от Mihai Costea поддерживает группы доступа:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
Перед использованием цепочки для ключей: дважды подумайте, прежде чем хранить пароли. Во многих случаях может быть достаточно сохранения токена аутентификации (такого как идентификатор сеанса постоянства) и электронной почты или имени учетной записи. Вы можете легко аннулировать токены аутентификации, чтобы заблокировать несанкционированный доступ, требуя от пользователя повторной регистрации на скомпрометированном устройстве, но не требуя сброса пароля и повторной регистрации на всех устройствах (мы не только используем Apple, не так ли?).
источник
Но теперь вы можете использовать NURLCredential вместо оболочки для ключей. Он делает то, что нам нужно сделать.
источник
Для Swift вы можете использовать эту библиотеку:
https://github.com/jrendel/SwiftKeychainWrapper
Поддерживаются все версии swift.
источник
Следующее должно работать просто отлично:
источник