Mis vahe on Keychain ja User Defaults?
sobes.tech AI
Vastus AI-lt
UserDefaults kasutatakse väikeste, mitte-konfidentsiaalsete andmete, näiteks kasutaja seadete või rakenduse oleku salvestamiseks. Andmed salvestatakse võtme-väärtuse paaridena .plist failis ja on kättesaadavad kõigile rakenduse osadele. UserDefaults ei krüpteeri andmeid ning ei sobi kriitiliselt olulise teabe salvestamiseks.
Keychain kasutatakse turvaliseks konfidentsiaalsete andmete, näiteks paroolide, sertifikaatide, tokenite ja muu tundliku teabe salvestamiseks. Andmed krüpteeritakse ning salvestatakse spetsiaalsesse salvestusruumi, millele pääseb ligi ainult see rakendus, mis need kirjutas. Keychain on toetatud operatsioonisüsteemi tasemel ning tagab kõrge andmekaitse taseme.
Peamised erinevused:
| Omadus | UserDefaults | Keychain |
|---|---|---|
| Eesmärk | Mitte-konfidentsiaalsete seadete salvestamine | Konfidentsiaalsete andmete salvestamine (paroolid, tokenid) |
| Turvalisus | Ei sisalda sisseehitatud krüpteerimist | Andmed on krüpteeritud |
| Juurdepääs | Saadaval kõigile rakenduse osadele | Saadaval ainult sellele rakendusele, mis need kirjutas |
| Andmete maht | Sobib väikeste andmekoguste jaoks | Sobib väikeste konfidentsiaalsete andmete jaoks |
| Rakendamine | Lihtne API, salvestamine .plist failis |
Keerulisem API, salvestamine süsteemses salvestusruumis |
Näide UserDefaults kasutamisest:
// Väärtuse salvestamine
UserDefaults.standard.set("dark", forKey: "theme")
// Väärtuse saamine
let theme = UserDefaults.standard.string(forKey: "theme")
Näide Keychain kasutamisest (nõuab töötamist SecItem API või raamidega):
// Parooli lisamine (lihtsustatud, nõuab vigade töötlemist ja täiendavaid parameetreid)
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)
// Staatusse vastuse töötlemine
// Parooli saamine (lihtsustatud, nõuab vigade töötlemist)
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)
// Parooli kasutamine
}