Keychain ile User Defaults arasındaki fark nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
UserDefaults, kullanıcı ayarları veya uygulama durumu gibi küçük ve gizli olmayan verilerin saklanması için kullanılır. Veriler, .plist dosyasında anahtar-değer çiftleri olarak saklanır ve uygulamanın tüm bölümlerinden erişilebilir. UserDefaults, verileri şifrelemez ve kritik bilgiler için uygun değildir.
Keychain, şifreler, sertifikalar, tokenler ve diğer hassas bilgiler gibi gizli verilerin güvenli bir şekilde saklanması için kullanılır. Veriler şifrelenir ve yalnızca onları kaydeden uygulama tarafından erişilebilen özel bir depolama alanında saklanır. Keychain, işletim sistemi seviyesinde desteklenir ve yüksek seviyede veri koruması sağlar.
Anahtar farklar:
| Özellik | UserDefaults | Keychain |
|---|---|---|
| Amaç | Gizli olmayan ayarların saklanması | Gizli verilerin saklanması (şifreler, tokenler) |
| Güvenlik | Yerleşik şifreleme yok | Veriler şifrelenir |
| Erişim | Uygulamanın tüm bölümlerinden erişilebilir | Sadece veriyi kaydeden uygulama tarafından erişilebilir |
| Veri hacmi | Küçük veri hacimleri için uygundur | Gizli veriler için küçük hacimler uygundur |
| Uygulama | Basit API, .plist dosyasında saklama |
Daha karmaşık API, sistem depolama alanında saklama |
UserDefaults kullanımı örneği:
// Değer kaydetme
UserDefaults.standard.set("dark", forKey: "theme")
// Değer alma
let theme = UserDefaults.standard.string(forKey: "theme")
Keychain kullanımı örneği (SecItem API veya sarmalayıcılar ile çalışmayı gerektirir):
// Şifre ekleme örneği (basitleştirilmiş, hata yönetimi ve ek parametreler gerektirir)
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)
// Durumu yönet
// Şifre alma örneği (basitleştirilmiş, hata yönetimi gerektirir)
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)
// Şifre kullanımı
}