Kāda ir atšķirība starp Keychain un User Defaults?
sobes.tech AI
Atbilde no AI
UserDefaults tiek izmantots nelielu, ne konfidenciālu datu, piemēram, lietotāja iestatījumu vai lietojumprogrammas stāvokļa, glabāšanai. Dati tiek glabāti kā atslēgas-vērtības pāri .plist failā un ir pieejami visām lietojumprogrammas daļām. UserDefaults nešifrē datus un nav piemērots kritiski svarīgas informācijas glabāšanai.
Keychain tiek izmantots drošai konfidenciālu datu glabāšanai, piemēram, paroles, sertifikāti, tokeni un cita jutīga informācija. Dati tiek šifrēti un glabāti specializētā glabātuvē, kam piekļūt var tikai tā lietojumprogramma, kura tos ir ierakstījusi. Keychain ir atbalstīts operētājsistēmas līmenī un nodrošina augstu datu aizsardzības līmeni.
Galvenās atšķirības:
| Raksturlielums | UserDefaults | Keychain |
|---|---|---|
| Mērķis | Glabāt ne konfidenciālus iestatījumus | Glabāt konfidenciālus datus (paroles, tokenus) |
| Drošība | Nav iebūvētas šifrēšanas | Dati ir šifrēti |
| Piekļuve | Pieejams visām lietojumprogrammas daļām | Pieejams tikai lietojumprogrammai, kura tos ir ierakstījusi |
| Datu apjoms | Piemērots mazam datu apjomam | Piemērots mazam konfidenciālu datu apjomam |
| Realizācija | Vienkāršs API, glabāšana .plist failā |
Sarežģītāks API, glabāšana sistēmiskajā glabātuvē |
Piemērs, kā izmantot UserDefaults:
// Vērtības saglabāšana
UserDefaults.standard.set("dark", forKey: "theme")
// Vērtības iegūšana
let theme = UserDefaults.standard.string(forKey: "theme")
Piemērs, kā izmantot Keychain (prasa darbu ar SecItem API vai ietvari):
// Paroles pievienošana (vienkāršota, prasa kļūdu apstrādi un papildu parametrus)
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)
// Statusa apstrāde
// Paroles iegūšana (vienkāršota, prasa kļūdu apstrādi)
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)
// Paroles izmantošana
}