Skip to content

Instantly share code, notes, and snippets.

@gromwel
Created April 4, 2021 22:18
Show Gist options
  • Save gromwel/c340bb5fa787396cfd06d8bf154edce5 to your computer and use it in GitHub Desktop.
Save gromwel/c340bb5fa787396cfd06d8bf154edce5 to your computer and use it in GitHub Desktop.
Keychain manager set get delete update
final class KeychainManager {
static func set(data: Data, service: String, account: String) {
// Данные для сохранения
let item = [
kSecClass: kSecClassGenericPassword,
kSecValueData: data,
kSecAttrService: service,
kSecAttrAccount: account,
] as CFDictionary
// Статус записи
let status = SecItemAdd(item, nil)
// Разбираем статус записи
if status == errSecSuccess {
#if DEBUG
NSLog("[KeychainManager] setting \(service):\(account) was successful")
#endif
} else {
#if DEBUG
NSLog("[KeychainManager] error: \(status)")
#endif
}
}
static func get(service: String, account: String) -> Data? {
// Запрос на получение данных
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: service,
kSecAttrAccount: account,
kSecReturnData: true,
] as CFDictionary
// Место для сохранения результатов
var ref: AnyObject?
// Статус получения данных
let status = SecItemCopyMatching(query, &ref)
// Разбираем статус получения данных
if status == errSecSuccess {
return ref as? Data
} else {
#if DEBUG
NSLog("[KeychainManager] error: \(status)")
#endif
return nil
}
}
static func update(service: String, account: String, newData: Data) {
// Запрос для поиска обновляемого элемента
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: service,
kSecAttrAccount: account,
] as CFDictionary
// Данные которые обновляем
let update = [
kSecValueData: newData,
] as CFDictionary
// Статус обновления данных
let status = SecItemUpdate(query, update)
// Разбираем статус обновления
if status == errSecSuccess {
#if DEBUG
NSLog("[KeychainManager] updation \(service):\(account) was successful")
#endif
} else {
#if DEBUG
NSLog("[KeychainManager] error: \(status)")
#endif
}
}
static func delete(service: String, account: String) {
// Запрос на удаление
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: service,
kSecAttrAccount: account,
] as CFDictionary
// Статус удаления данных
let status = SecItemDelete(query)
// Разбираем статус удаления
if status == errSecSuccess {
#if DEBUG
NSLog("[KeychainManager] deletion \(service):\(account) was successful")
#endif
} else {
#if DEBUG
NSLog("[KeychainManager] error: \(status)")
#endif
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment