Фарқи байни Keychain ва User Defaults чист?
sobes.tech AI
Ҷавоб аз AI
UserDefaults барои нигоҳдории маълумоти хурд, ки сирри онҳо нест, истифода мешавад, масалан танзимоти корбар ё ҳолати барнома. Маълумотҳо дар шакли ҷуфтҳои калид-арзиш дар файли .plist нигоҳ дошта мешаванд ва барои ҳамаи қисмҳои барнома дастрасанд. UserDefaults маълумотҳоро рамзгузорӣ намекунад ва барои нигоҳдории маълумоти муҳим мувофиқ нест.
Keychain барои нигоҳдории бехатаронаи маълумоти сиррӣ, масалан паролҳо, сертификатҳо, токенҳо ва дигар маълумоти ҳассос истифода мешавад. Маълумотҳо рамзгузорӣ мешаванд ва дар анбори махсус нигоҳ дошта мешаванд, ки танҳо барномае, ки онҳоро навиштааст, метавонад ба онҳо дастрасӣ пайдо кунад. Keychain дар сатҳи системаи оператсионӣ дастгирӣ мешавад ва сатҳи баланди ҳифзро таъмин мекунад.
Тафовутҳои асосӣ:
| Хусусият | UserDefaults | Keychain |
|---|---|---|
| Мақсад | Нигоҳдории танзимоти ғайри сиррӣ | Нигоҳдории маълумоти сиррӣ (паролҳо, токенҳо) |
| Бехатарӣ | Шифркунии дарунӣ надорад | Маълумотҳо шифргузорӣ мешаванд |
| Дастрасӣ | Дар ҳама қисмҳои барнома дастрас аст | Танҳо ба барнома, ки онҳоро навиштааст, дастрас аст |
| Ҳаҷм | Барои маълумоти хурд мувофиқ | Барои маълумоти хурди сиррӣ мувофиқ |
| Реализация | API содда, нигоҳдории дар файли .plist |
API мураккабтар, нигоҳдории дар анбори системӣ |
Маслиҳат барои истифодаи UserDefaults:
// Ҳарфгузорӣ арзиш
UserDefaults.standard.set("dark", forKey: "theme")
// Гирифтани арзиш
let theme = UserDefaults.standard.string(forKey: "theme")
Маслиҳат барои истифодаи Keychain (талап мекунад кор бо API SecItem ё обёркаҳо):
// Илова кардани парол (оддӣ, талаб мекунад кор бо хато ва параметрҳои иловагӣ)
let password = "mySecretPassword".data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "myAccount",
kSecValueData as String: password
]
let statusAdd = SecItemAdd(query as CFDictionary, nil)
// Ҳолати коркарди
// Гирифтани парол (оддӣ, талаб мекунад кор бо хато)
let queryGet: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "myAccount",
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne
]
var item: CFTypeRef?
let statusGet = SecItemCopyMatching(queryGet as CFDictionary, &item)
if statusGet == errSecSuccess {
let retrievedData = item as! Data
let retrievedPassword = String(data: retrievedData, encoding: .utf8)
// Истифодаи парол
}