Keychain və User Defaults arasındakı fərq nədir?
sobes.tech Süni İntellekt
AI-dan cavab
UserDefaults istifadəçi parametrləri və ya tətbiqin vəziyyəti kimi kiçik və qeyri-gizli məlumatların saxlanması üçün istifadə olunur. Məlumatlar .plist faylında açar-dəyər cütləri şəklində saxlanılır və tətbiqin bütün hissələrində əlçatandır. UserDefaults məlumatları şifrələməz və kritik məlumatların saxlanması üçün uyğun deyil.
Keychain gizli məlumatların, məsələn, şifrələr, sertifikatlar, tokenlər və digər həssas məlumatların təhlükəsiz saxlanması üçün istifadə olunur. Məlumatlar şifrələnir və yalnız onları saxlayan tətbiqə əlçatan olan xüsusi saxlama yerində saxlanılır. Keychain əməliyyat sistemi səviyyəsində dəstəklənir və yüksək səviyyədə məlumat qoruması təmin edir.
Əsas fərqlər:
| Xüsusiyyət | UserDefaults | Keychain |
|---|---|---|
| Məqsəd | Gizli olmayan parametrlərin saxlanması | Gizli məlumatların saxlanması (şifrələr, tokenlər) |
| Təhlükəsizlik | Daxili şifrələmə yoxdur | Məlumatlar şifrələnir |
| Əlçatanlıq | Bütün tətbiq hissələri üçün əlçatandır | Yalnız məlumatı saxlayan tətbiq üçün əlçatandır |
| Məlumat həcmi | Kiçik həcmdə məlumatlar üçün uyğundur | Kiçik həcmdə gizli məlumatlar üçün uyğundur |
| İcra | Sadə API, .plist faylında saxlanma |
Daha mürəkkəb API, sistem yaddaşında saxlanma |
UserDefaults istifadəsi nümunəsi:
// Dəyər saxlama
UserDefaults.standard.set("dark", forKey: "theme")
// Dəyər əldə etmə
let theme = UserDefaults.standard.string(forKey: "theme")
Keychain istifadəsi nümunəsi (SecItem API və ya wrapper-lərlə işləmə tələb edir):
// Şifrə əlavə etmə nümunəsi (sadələşdirilmiş, səhvlərin idarə olunması və əlavə parametrlər tələb edir)
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)
// Statusu idarə et
// Şifrə əldə etmə nümunəsi (sadələşdirilmiş, səhvlərin idarə olunması tələb edir)
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)
// Şifrə istifadə ediləcək
}