Посмотрите на этот пример:
Определите структуру для хранения учетных данных при их перемещении по вашему приложению в памяти:
struct Credentials {
var username: String
var password: String
}
Далее определите перечисление ошибок, которое вы можетеиспользуйте для передачи результатов доступа цепочки для ключей:
enum KeychainError: Error {
case noPassword
case unexpectedPasswordData
case unhandledError(status: OSStatus)
}
Затем укажите сервер, с которым работает ваше приложение:
static let server = "www.example.com"
Создайте запрос Add, используя экземпляр структуры учетных данных иконстанту сервера, вы можете создать запрос на добавление:
let account = credentials.username
let password = credentials.password.data(using: String.Encoding.utf8)!
var query: [String: Any] = [kSecClass as String: kSecClassInternetPassword,
kSecAttrAccount as String: account,
kSecAttrServer as String: server,
kSecValueData as String: password]
Добавить элемент После завершения запроса вы просто передаете его в функцию SecItemAdd(_:_:)
:
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else { throw KeychainError.unhandledError(status: status) }
Источник