NSUserDefaults — iOS, watchOS, tvOS və macOS-da tətbiq parametrlərini və konfiqurasiyalarını saxlamaq üçün nəzərdə tutulmuş açar-dəyər məlumat anbarıdır. Məlumatlar tətbiqin sandboxunda plist faylında saxlanılır və NSUbiquitousKeyValueStore vasitəsilə avtomatik olaraq iCloud ilə sinxronlaşır. Rəsmi sənədlərə görə Apple Developer, 2025, NSUserDefaults primitiv növlərin saxlanmasını dəstəkləyir: String, Int, Bool, Float, Double, Data, Date, Array və Dictionary. Sinif Swift 3-dən etibarən UserDefaults olaraq adlandırılsa da, onun Objective-C adı NSUserDefaults kod bazasında və Apple sənədlərində geniş istifadə olunmaqdadır.
Əsas məqamlar
NSUserDefaults (Swift-də UserDefaults) — Apple-ın açar-dəyər cütlərini plist formatında saxlamaq üçün daxili mexanizmidir. Bütün Apple platformalarında mövcuddur: iOS, iPadOS, watchOS, tvOS və macOS. Əsas təyinat — istifadəçi seçimlərinin, interfeys vəziyyətinin, ilk açılış bayraqlarının, seçilmiş opsiyaların və tətbiq yenidən başladıqda qalan digər sadə məlumatların saxlanması.
Hər bir iOS tətbiqinin izolyasiya olunmuş sandboxu var və NSUserDefaults bu sandbox daxilində Library/Preferences qovluğunda Bundle Identifier adlı faylda saxlanılır. plist faylı açar-dəyər cütlərini ehtiva edir, burada açar sətir, dəyər isə dəstəklənən növlərdən biridir. Fayl ölçüsü məhdud deyil, lakin Apple UserDefaults-da yalnız parametrlərin saxlanmasını tövsiyə edir, böyük həcmdə məlumat yox.
iOS 8-dən etibarən NSUserDefaults App Groups-u dəstəkləyir — eyni tərtibatçının tətbiqləri və onların genişləndirmələri (vidjetlər, watchOS köməkçi tətbiqləri) arasında ümumi anbar. Bunun üçün App Group identifikatoru ilə init?(suiteName:) inizializatoru istifadə olunur. Bu, məsələn, Today ekranındakı vidjetə əsas tətbiqdən parametrləri oxumağa imkan verir.
Fiziki olaraq NSUserDefaults ikili plist faylında saxlanılır: {Sandbox}/Library/Preferences/com.example.myapp.plist. Fayl yığcamlıq və oxuma sürəti üçün ikili plist formatından (NSPropertyListBinaryFormat_v1_0) istifadə edir. macOS-da fayl uyğunluq üçün XML formatında ola bilər. Android-dəki SharedPreferences-dən fərqli olaraq, UserDefaults plist faylları Dictionary və Array vasitəsilə iç-içə strukturlar ehtiva edə bilər.
NSUserDefaults faylları defolt olaraq şifrələnmir. Məlumatlar açıq formada saxlanılır və cihaza fiziki giriş və ya ehtiyat nüsxə vasitəsilə oxuna bilər. Həssas məlumatların (parollar, tokenlər, şifrələmə açarları) saxlanması üçün Apple qəti şəkildə əməliyyat sistemi səviyyəsində məlumatları avtomatik şifrələyən Keychain istifadəsini tövsiyə edir.
NSUserDefaults dövri disk sinxronizasiyası ilə yaddaşda keşləmə prinsipi ilə işləyir. Standart UserDefaults.standard nümunəsinə ilk müraciətdə sistem plist faylını Dictionary formasında operativ yaddaşa yükləyir. Bütün sonrakı oxumalar yaddaşdan aparılır. Yazma da əvvəlcə yaddaşda aparılır, diskə sinxronizasiya isə fonda dövri olaraq baş verir.
Yazma əməliyyatları set(_:forKey:) metodundan istifadə edir, bu metod Any? opsional tipinin dəyərini qəbul edir. Dəyər nil ola bilər — açarı silmək üçün. Diskə dərhal yazmaq üçün əvvəllər synchronize() metodundan istifadə olunurdu, lakin iOS 7 və OS X 10.9-dan etibarən artıq tələb olunmur — sistem məlumatları müntəzəm olaraq avtomatik sinxronlaşdırır. Apple rəsmi olaraq synchronize()-ı öz sənədlərində artıq hesab edir.
NSUserDefaults dəyər tapmağı təşkil etmək üçün qeydiyyat (domen) sistemindən istifadə edir. Tətbiq açar üzrə dəyər tələb etdikdə, UserDefaults ardıcıl olaraq domenləri müəyyən qaydada yoxlayır: əvvəlcə NSArgumentDomain (əmr sətri arqumentləri), sonra tətbiq domeni (Application), daha sonra NSGlobalDomain (sistem parametrləri), sonra Dil-spesifik domenlər və nəhayət NSRegistrationDomain (register(defaults:) vasitəsilə qeydiyyatdan keçmiş defolt dəyərlər).
import Foundation
// Standart UserDefaults nümunəsi
let defaults = UserDefaults.standard
// Dəyərlərin yazılması
defaults.set("Anna Petrova", forKey: "username")
defaults.set(28, forKey: "age")
defaults.set(true, forKey: "isLoggedIn")
// Defolt dəyərlərin qeydiyyatı
defaults.register(defaults: [
"theme": "system",
"fontSize": 14
])
// Defolt dəyərin qaytarılması ilə oxuma
let theme = defaults.string(forKey: "theme") ?? "system"
let fontSize = defaults.integer(forKey: "fontSize")
NSRegistrationDomain — yalnız operativ yaddaşda mövcud olan və diskə yazılmayan proqram domenidir. O, tətbiq öz dəyərini tətbiq domeninə yazana qədər fəaliyyət göstərən defolt dəyərləri təyin etmək üçün istifadə olunur. Bu, inkişaf mərhələsində mərkəzləşdirilmiş şəkildə dəyişdirilə bilən vahid defolt parametrlər konfiqurasiya nöqtəsi yaratmağa imkan verir.
NSUserDefaults məlumatların oxunması və yazılması üçün tipizasiya olunmuş metodlar dəsti təqdim edir: string(forKey:), integer(forKey:), bool(forKey:), float(forKey:), double(forKey:), data(forKey:), array(forKey:), dictionary(forKey:) və object(forKey:). Hər bir oxuma metodunun saxlanılan dəyərin tipini avtomatik təyin edən müvafiq set(_:forKey:) yazma metodu var. Swift versiyası UserDefaults ciddi tipizasiyadan istifadə edir, lakin Objective-C versiyası id qəbul edir və qaytarır.
| Oxuma metodu (Swift) | Məlumat növü | Defolt dəyər |
|---|---|---|
| string(forKey:) | String? | nil |
| integer(forKey:) | Int | 0 |
| bool(forKey:) | Bool | false |
| float(forKey:) | Float | 0.0 |
| double(forKey:) | Double | 0.0 |
| data(forKey:) | Data? | nil |
synchronize() metodu NSUserDefaults-da bütün dəyişiklikləri yaddaşdan diskə məcburi yazır. iOS-un ilkin versiyalarında bu metodu hər yazmadan sonra çağırmaq lazım idi. iOS 7-dən etibarən sistem UserDefaults-ı fonda avtomatik sinxronlaşdırır və Apple rəsmi olaraq synchronize()-ı artıq hesab edir. Bu metodun çağırılması xətaya səbəb olmur, lakin əlavə təhlükəsizlik zəmanəti vermir.
Dəyişiklikləri izləmək üçün NSUserDefaults UserDefaults.didChangeNotification bildirişini və addObserver(_:forKeyPath:options:context:) KVO müşahidə metodunu təqdim edir. SwiftUI-də UI yenilənməsi ilə UserDefaults dəyərini avtomatik sinxronlaşdıran @AppStorage Property Wrapper mövcuddur. @AppStorage UserDefaults ilə eyni növləri dəstəkləyir və SwiftUI tətbiqlərində parametrlərlə işin üstünlük verilən üsuludur.
// KVO vasitəsilə dəyişikliklərin izlənməsi
class SettingsViewModel: NSObject {
override func observeValue(
forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey: Any]?,
context: UnsafeMutableRawPointer?
) {
guard let keyPath else { return }
print("Açar dəyişdi: \(keyPath)")
}
}
// SwiftUI - AppStorage
struct SettingsView: View {
@AppStorage("theme") private var theme: String = "system"
var body: some View {
Picker("Mövzu", selection: $theme) {
Text("Sistem").tag("system")
Text("Açıq").tag("light")
Text("Qaranlıq").tag("dark")
}
}
}
App Groups (tətbiq və genişləndirmələr arasında ümumi anbar) ilə işləmək üçün App Group identifikatoru ilə UserDefaults(suiteName:) inizializatoru istifadə olunur. Məsələn, "group.com.example.myapp". Bu nümunəyə yazılmış məlumatlar əsas tətbiqdən, vidjetdən, watchOS köməkçi tətbiqindən və eyni App Group-a aid digər genişləndirmələrdən əlçatandır. Hər bir suite nümunəsi ayrıca plist faylında saxlanılır.
Rahatlığına və sadəliyinə baxmayaraq, NSUserDefaults iOS-da bütün məlumat növləri üçün universal anbar deyil. Həcmdən, kritiklikdən və təhlükəsizlik tələblərindən asılı olaraq, Apple hər biri konkret istifadə ssenarisi üçün optimallaşdırılmış bir neçə alternativ təqdim edir.
| Həll | Nə vaxt istifadə etməli | Məhdudiyyətlər |
|---|---|---|
| NSUserDefaults | İnterfeys parametrləri və konfiqurasiya | Böyük məlumatlar və sirlər üçün uyğun deyil |
| Keychain | Parollar, tokenlər, şifrələmə açarları | İstifadəsi daha mürəkkəb, daha yavaş |
| CoreData | Əlaqələri olan strukturlaşdırılmış məlumat | 10-20 parametr üçün həddən artıq |
| FileManager | Sənədlər, şəkillər, ikili məlumat | Əl ilə fayl idarəsi tələb edir |
| CloudKit | Cihazlar arasında bulud sinxronizasiyası | iCloud hesabı və şəbəkə bağlantısı tələb edir |
Keychain — Apple-ın məxfi məlumatlar üçün qorunan anbarıdır. NSUserDefaults-dan fərqli olaraq, Keychain-dəki bütün məlumatlar uyğun cihazlarda Secure Enclave aparat şifrələməsindən istifadə etməklə əməliyyat sistemi səviyyəsində şifrələnir. Keychain cihazla birlikdə avtomatik bloklanır və blokdan çıxarılır və Keychain Access Groups vasitəsilə eyni tərtibatçının tətbiqləri arasında giriş bölgüsünü dəstəkləyir.
Keychain-in əsas çatışmazlığı API-nin mürəkkəbliyidir. Sadə bir sətir saxlamaq üçün atributları göstərməklə SecItemAdd sorğusu yaratmaq lazımdır: sinif (kSecClassGenericPassword), xidmət (kSecAttrService), hesab (kSecAttrAccount) və məlumat (kSecValueData). Keychain ilə işi asanlaşdırmaq üçün UserDefaults-a bənzər rahat açar-dəyər interfeysi təmin edən KeychainAccess və SwiftKeychainWrapper kimi üçüncü tərəf qurğuları mövcuddur.
Praktiki nümunəyə baxaq: NSUserDefaults istifadə edərək iOS tətbiqində onboarding (qarşılama ekranları) vəziyyətinin saxlanması və bərpası. İlk işə salındıqda istifadəçi onboarding ekranlarını görür, onları keçdikdən sonra bayraq UserDefaults-da saxlanılır. Sonrakı işə salmalarda onboarding atlanır. SwiftUI üçün @AppStorage, UIKit üçün UserDefaults.standard-a birbaşa giriş istifadə olunur.
Onboarding statusunu saxlamaq üçün UserDefaults ilə işi inkapsulyasiya edən OnboardingManager meneceri yaradaq. Menecer vəziyyəti yoxlamaq üçün isOnboardingCompleted xassəsini və bayrağı təyin etmək üçün markOnboardingCompleted metodunu təqdim edir. Saxlama açarı səhvlərin qarşısını almaq üçün sabitə çıxarılıb. Vahid testlər üçün menecer UserDefaultsProtocol protokolundan istifadə edir ki, bu da real anbarı MockUserDefaults ilə əvəz etməyə imkan verir.
class OnboardingManager {
private let defaults: UserDefaults
private let hasSeenKey = "has_seen_onboarding"
init(defaults: UserDefaults = .standard) {
self.defaults = defaults
}
var isOnboardingCompleted: Bool {
defaults.bool(forKey: hasSeenKey)
}
func markOnboardingCompleted() {
defaults.set(true, forKey: hasSeenKey)
}
func resetOnboarding() {
defaults.removeObject(forKey: hasSeenKey)
}
}
// Tətbiqdə istifadə
let onboardingManager = OnboardingManager()
if !onboardingManager.isOnboardingCompleted {
showOnboarding()
} else {
showMainScreen()
}
Strukturlaşdırılmış Profile obyekti kimi daha mürəkkəb parametrləri saxlamaq üçün Codable protokolu və JSONEncoder/JSONDecoder istifadəsi tövsiyə olunur. Obyekt JSONEncoder vasitəsilə Data-ya serializasiya olunur, set(_:forKey:) ilə saxlanılır və oxuyarkən JSONDecoder vasitəsilə Data-dan yenidən obyektə deserializasiya olunur. Bu yanaşma tip təhlükəsizliyini itirmədən UserDefaults-da mürəkkəb strukturları saxlamağa imkan verir.
struct UserProfile: Codable {
let name: String
let age: Int
let preferences: [String: String]
}
extension UserDefaults {
func save<T: Codable>(_ value: T, forKey key: String) {
if let data = try? JSONEncoder().encode(value) {
set(data, forKey: key)
}
}
func load<T: Codable>(_ type: T.Type, forKey key: String) -> T? {
guard let data = data(forKey: key) else { return nil }
return try? JSONDecoder().decode(type, from: data)
}
}
// İstifadə
let profile = UserProfile(name: "Anna", age: 28, preferences: ["theme": "dark"])
UserDefaults.standard.save(profile, forKey: "user_profile")
let loaded = UserDefaults.standard.load(UserProfile.self, forKey: "user_profile")
Xatırlamaq vacibdir ki, NSUserDefaults böyük həcmdə məlumat saxlamaq üçün nəzərdə tutulmayıb. Apple saxlanılan məlumatların ölçüsünü bir neçə on kilobaytla məhdudlaşdırmağı tövsiyə edir. Böyük obyektləri (şəkillər, sənədlər, serializasiya olunmuş modellər) saxlamaq üçün Documents qovluğu ilə FileManager və ya CoreData istifadə edilməlidir. Bundan əlavə, UserDefaults məlumat sxeminin versiyalaşdırılmasını dəstəkləmir — Codable modelinin strukturu dəyişdikdə köhnə məlumatlar deserializasiya olunmaya bilər və bu, tətbiq kodunda idarə edilməlidir.
Tez-tez verilən suallar
Hər ikisi açar-dəyər anbarlarıdır, lakin NSUserDefaults daha çox növü dəstəkləyir (Data, Date, Array, Dictionary) və iCloud ilə avtomatik sinxronlaşır. SharedPreferences məlumatları XML-də, NSUserDefaults isə plist formatında saxlayır. NSUserDefaults kaskad axtarışlı domen sisteminə malikdir, SharedPreferences fayl adları ilə sadə düz strukturdan istifadə edir.
Xeyr, NSUserDefaults məlumatları şifrələmədən açıq formada saxlayır. Parollar, tokenlər və şifrələmə açarları üçün məlumatları Secure Enclave səviyyəsində şifrələyən Keychain istifadə edin. Keychain həmçinin sirri oxumazdan əvvəl biometrik autentifikasiya (Face ID / Touch ID) kimi giriş atributlarını dəstəkləyir.
Eyni istifadəçinin cihazları arasında sinxronizasiya üçün NSUbiquitousKeyValueStore — iCloud bulud açar-dəyər anbarından istifadə edin. Bir cihazda bu xidmətə yazılmış məlumatlar avtomatik olaraq eyni iCloud hesabının bütün digər cihazlarında görünür. Maksimum həcm — tətbiq üçün 1 MB, 1024 açar.
Bütün məlumatları silmək üçün tətbiqin Bundle Identifier ilə removePersistentDomain(forName:) metodunu çağırın. Ayrı-ayrı dəyərləri silmək üçün removeObject(forKey:) istifadə edin. Tətbiq parametrlərini tam sıfırlamaq üçün: UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!). Bütün silmələr dərhal yaddaş keşində tətbiq olunur.
Apple NSUserDefaults üçün sərt limit təyin etmir, lakin bütün saxlanılan məlumatların ümumi həcminin 100 KB-dan çox olmaması tövsiyə olunur. Böyük həcmlər üçün CoreData və ya FileManager istifadə edin. 1 MB-dan çox məlumat saxladıqda tətbiqin işə salınması zamanı oxuma performansı nəzərəçarpacaq dərəcədə azala bilər.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun