Sobes.tech
Junior

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ı
}