Sobes.tech
Junior

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
}