NSUserDefaults iOS, watchOS, tvOS और macOS में एक की-वैल्यू डेटा स्टोरेज है, जो एप्लिकेशन सेटिंग्स और कॉन्फ़िगरेशन को सहेजने के लिए डिज़ाइन किया गया है। डेटा एप्लिकेशन सैंडबॉक्स में plist फ़ाइल में संग्रहीत होता है और NSUbiquitousKeyValueStore के माध्यम से स्वचालित रूप से iCloud के साथ सिंक होता है। आधिकारिक दस्तावेज़ीकरण के अनुसार Apple Developer, 2025, NSUserDefaults प्रिमिटिव प्रकारों के भंडारण का समर्थन करता है: String, Int, Bool, Float, Double, Data, Date, Array और Dictionary। Swift 3 से इस वर्ग का नाम बदलकर UserDefaults कर दिया गया, लेकिन इसका Objective-C नाम NSUserDefaults कोड बेस और Apple दस्तावेज़ीकरण में व्यापक रूप से उपयोग किया जाता है।
मुख्य बातें
NSUserDefaults (Swift में UserDefaults) plist प्रारूप में की-वैल्यू जोड़े संग्रहीत करने के लिए Apple की अंतर्निहित तंत्र है। यह सभी Apple प्लेटफ़ॉर्म पर उपलब्ध है: iOS, iPadOS, watchOS, tvOS और macOS। इसका मुख्य उद्देश्य उपयोगकर्ता प्राथमिकताएँ, इंटरफ़ेस स्थिति, प्रथम-लॉन्च फ़्लैग, चयनित विकल्प और अन्य सरल डेटा सहेजना है जो एप्लिकेशन पुनरारंभ के बाद भी बना रहता है।
प्रत्येक iOS एप्लिकेशन में एक पृथक सैंडबॉक्स होता है, और NSUserDefaults इस सैंडबॉक्स के अंदर Library/Preferences निर्देशिका में Bundle Identifier नामक फ़ाइल में संग्रहीत होता है। plist फ़ाइल में की-वैल्यू जोड़े होते हैं जहाँ कुंजी एक स्ट्रिंग है और मान समर्थित प्रकारों में से एक है। फ़ाइल का आकार सीमित नहीं है, लेकिन Apple UserDefaults में केवल सेटिंग्स संग्रहीत करने की अनुशंसा करता है, बड़ी मात्रा में डेटा नहीं।
iOS 8 से शुरू करके, NSUserDefaults ने App Groups का समर्थन करना शुरू किया — एक ही डेवलपर के एप्लिकेशन और उनके एक्सटेंशन (विजेट, watchOS कम्पैनियन ऐप) के बीच साझा स्टोरेज। इसके लिए App Group पहचानकर्ता के साथ init?(suiteName:) इनिशियलाइज़र का उपयोग किया जाता है। यह उदाहरण के लिए, Today विजेट को सेव लॉजिक को डुप्लिकेट किए बिना मुख्य एप्लिकेशन से सेटिंग्स पढ़ने की अनुमति देता है।
भौतिक रूप से, NSUserDefaults एक बाइनरी plist फ़ाइल में संग्रहीत होता है: {Sandbox}/Library/Preferences/com.example.myapp.plist। फ़ाइल कॉम्पैक्टनेस और पढ़ने की गति के लिए बाइनरी plist प्रारूप (NSPropertyListBinaryFormat_v1_0) का उपयोग करती है। macOS पर, फ़ाइल संगतता के लिए XML प्रारूप में हो सकती है। Android पर SharedPreferences के विपरीत, UserDefaults की plist फ़ाइलों में Dictionary और Array के माध्यम से नेस्टेड संरचनाएँ हो सकती हैं।
NSUserDefaults फ़ाइलें डिफ़ॉल्ट रूप से एन्क्रिप्टेड नहीं होती हैं। डेटा सादे पाठ में संग्रहीत होता है और डिवाइस तक भौतिक पहुँच या बैकअप के माध्यम से पढ़ा जा सकता है। संवेदनशील डेटा (पासवर्ड, टोकन, एन्क्रिप्शन कुंजियाँ) संग्रहीत करने के लिए, Apple ऑपरेटिंग सिस्टम स्तर पर स्वचालित रूप से डेटा एन्क्रिप्ट करने वाले Keychain का उपयोग करने की दृढ़ता से अनुशंसा करता है।
NSUserDefaults समय-समय पर डिस्क सिंक्रोनाइज़ेशन के साथ मेमोरी कैशिंग सिद्धांत पर काम करता है। मानक UserDefaults.standard इंस्टेंस तक पहली पहुँच पर, सिस्टम plist फ़ाइल को Dictionary के रूप में RAM में लोड करता है। सभी बाद की रीडिंग मेमोरी से की जाती है। लेखन भी पहले मेमोरी में होता है, डिस्क सिंक्रोनाइज़ेशन समय-समय पर बैकग्राउंड थ्रेड पर होता है।
लेखन संचालन set(_:forKey:) विधि का उपयोग करते हैं, जो वैकल्पिक Any? प्रकार का मान स्वीकार करती है। मान nil हो सकता है — कुंजी हटाने के लिए उपयोग किया जाता है। तत्काल डिस्क लेखन के लिए, पहले synchronize() विधि का उपयोग किया जाता था, लेकिन iOS 7 और OS X 10.9 से इसकी अब आवश्यकता नहीं है — सिस्टम नियमित अंतराल पर स्वचालित रूप से डेटा सिंक करता है। Apple ने अपने दस्तावेज़ीकरण में synchronize() को अनावश्यक घोषित किया है।
NSUserDefaults मान लुकअप को व्यवस्थित करने के लिए रजिस्टर (डोमेन) की प्रणाली का उपयोग करता है। जब कोई एप्लिकेशन कुंजी द्वारा मान का अनुरोध करता है, UserDefaults एक विशिष्ट क्रम में क्रमिक रूप से डोमेन की जाँच करता है: पहले NSArgumentDomain (कमांड-लाइन आर्गुमेंट), फिर एप्लिकेशन डोमेन, फिर NSGlobalDomain (सिस्टम सेटिंग्स), फिर भाषा-विशिष्ट डोमेन, और अंत में NSRegistrationDomain (register(defaults:) के माध्यम से पंजीकृत डिफ़ॉल्ट मान)।
import Foundation
// UserDefaults का मानक इंस्टेंस
let defaults = UserDefaults.standard
// मान लिखना
defaults.set("अन्ना पेट्रोवा", forKey: "username")
defaults.set(28, forKey: "age")
defaults.set(true, forKey: "isLoggedIn")
// डिफ़ॉल्ट मान पंजीकृत करना
defaults.register(defaults: [
"theme": "system",
"fontSize": 14
])
// डिफ़ॉल्ट मान वापसी के साथ पढ़ना
let theme = defaults.string(forKey: "theme") ?? "system"
let fontSize = defaults.integer(forKey: "fontSize")
NSRegistrationDomain एक प्रोग्रामेटिक डोमेन है जो केवल मेमोरी में मौजूद है और डिस्क पर संग्रहीत नहीं होता। इसका उपयोग डिफ़ॉल्ट मान सेट करने के लिए किया जाता है जो तब तक लागू रहते हैं जब तक एप्लिकेशन एप्लिकेशन डोमेन में अपना मान नहीं लिखता। यह डिफ़ॉल्ट सेटिंग्स के लिए एकल कॉन्फ़िगरेशन बिंदु बनाने की अनुमति देता है जिसे डेवलपमेंट के दौरान केंद्रीय रूप से बदला जा सकता है।
NSUserDefaults डेटा पढ़ने और लिखने के लिए टाइप किए गए तरीकों का एक सेट प्रदान करता है: string(forKey:), integer(forKey:), bool(forKey:), float(forKey:), double(forKey:), data(forKey:), array(forKey:), dictionary(forKey:) और object(forKey:)। प्रत्येक पढ़ने की विधि में संग्रहीत मान के स्वचालित प्रकार निर्धारण के साथ set(_:forKey:) लिखने की विधि होती है। UserDefaults का Swift संस्करण मजबूत टाइपिंग का उपयोग करता है, लेकिन Objective-C संस्करण id स्वीकार और लौटाता है।
| पढ़ने की विधि (Swift) | डेटा प्रकार | डिफ़ॉल्ट मान |
|---|---|---|
| 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 |
NSUserDefaults में synchronize() विधि सभी परिवर्तनों को मेमोरी से डिस्क पर बलपूर्वक लिखती है। iOS के शुरुआती संस्करणों में, डेटा स्थिरता सुनिश्चित करने के लिए प्रत्येक लेखन के बाद इस विधि को कॉल करना आवश्यक था। iOS 7 से शुरू करके, सिस्टम बैकग्राउंड थ्रेड पर स्वचालित रूप से UserDefaults सिंक करता है, और Apple ने आधिकारिक तौर पर synchronize() को अनावश्यक घोषित किया है। इस विधि को कॉल करने से कोई त्रुटि नहीं होती लेकिन कोई अतिरिक्त स्थिरता गारंटी प्रदान नहीं करता।
परिवर्तनों की निगरानी के लिए, NSUserDefaults UserDefaults.didChangeNotification सूचना और KVO अवलोकन विधि addObserver(_:forKeyPath:options:context:) प्रदान करता है। SwiftUI में, @AppStorage Property Wrapper उपलब्ध है, जो UserDefaults में मान को UI अपडेट के साथ स्वचालित रूप से सिंक करता है। @AppStorage UserDefaults के समान प्रकारों का समर्थन करता है और SwiftUI एप्लिकेशन में सेटिंग्स के साथ काम करने का पसंदीदा तरीका है।
// KVO के माध्यम से परिवर्तन देखना
class SettingsViewModel: NSObject {
override func observeValue(
forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey: Any]?,
context: UnsafeMutableRawPointer?
) {
guard let keyPath else { return }
print("कुंजी बदली: \(keyPath)")
}
}
// SwiftUI - AppStorage
struct SettingsView: View {
@AppStorage("theme") private var theme: String = "system"
var body: some View {
Picker("थीम", selection: $theme) {
Text("सिस्टम").tag("system")
Text("हल्का").tag("light")
Text("गहरा").tag("dark")
}
}
}
App Groups (एप्लिकेशन और उसके एक्सटेंशन के बीच साझा स्टोरेज) के साथ काम करने के लिए, App Group पहचानकर्ता के साथ UserDefaults(suiteName:) इनिशियलाइज़र का उपयोग करें। उदाहरण के लिए, “group.com.example.myapp”। इस इंस्टेंस में लिखा गया डेटा मुख्य एप्लिकेशन, विजेट, watchOS कम्पैनियन ऐप और उसी App Group के अन्य एक्सटेंशन से सुलभ है। प्रत्येक suite इंस्टेंस एक अलग plist फ़ाइल में संग्रहीत होता है।
अपनी सुविधा और सरलता के बावजूद, NSUserDefaults iOS पर सभी डेटा प्रकारों के लिए एक सार्वभौमिक स्टोरेज समाधान नहीं है। मात्रा, महत्वपूर्णता और सुरक्षा आवश्यकताओं के आधार पर, Apple कई विकल्प प्रदान करता है, प्रत्येक एक विशिष्ट उपयोग मामले के लिए अनुकूलित है।
| समाधान | कब उपयोग करें | सीमाएँ |
|---|---|---|
| NSUserDefaults | इंटरफ़ेस सेटिंग्स और कॉन्फ़िगरेशन | बड़े डेटा या रहस्यों के लिए उपयुक्त नहीं |
| Keychain | पासवर्ड, टोकन, एन्क्रिप्शन कुंजियाँ | उपयोग में अधिक जटिल, धीमा |
| CoreData | संबंधों के साथ संरचित डेटा | 10–20 सेटिंग्स के लिए अत्यधिक |
| FileManager | दस्तावेज़, चित्र, बाइनरी डेटा | मैन्युअल फ़ाइल प्रबंधन की आवश्यकता |
| CloudKit | उपकरणों के बीच क्लाउड सिंक | iCloud खाता और नेटवर्क कनेक्शन आवश्यक |
Keychain गोपनीय डेटा के लिए Apple का सुरक्षित स्टोरेज है। NSUserDefaults के विपरीत, Keychain में सभी डेटा संगत उपकरणों पर Secure Enclave से हार्डवेयर एन्क्रिप्शन का उपयोग करके ऑपरेटिंग सिस्टम स्तर पर एन्क्रिप्ट किया जाता है। Keychain डिवाइस के साथ स्वचालित रूप से लॉक और अनलॉक होता है और Keychain Access Groups के माध्यम से एक ही डेवलपर के एप्लिकेशन के बीच एक्सेस साझाकरण का समर्थन करता है।
Keychain का मुख्य दोष API जटिलता है। केवल एक स्ट्रिंग सहेजने के लिए, आपको विशेषताएँ निर्दिष्ट करते हुए SecItemAdd क्वेरी बनाने की आवश्यकता है: वर्ग (kSecClassGenericPassword), सेवा (kSecAttrService), खाता (kSecAttrAccount), और वास्तविक डेटा (kSecValueData)। Keychain के साथ काम को सरल बनाने के लिए, तृतीय-पक्ष रैपर जैसे KeychainAccess और SwiftKeychainWrapper मौजूद हैं जो UserDefaults के समान सुविधाजनक की-वैल्यू इंटरफ़ेस प्रदान करते हैं।
एक व्यावहारिक उदाहरण पर विचार करें: NSUserDefaults का उपयोग करके iOS एप्लिकेशन में ऑनबोर्डिंग स्थिति (स्वागत स्क्रीन) को सहेजना और पुनर्स्थापित करना। पहले लॉन्च पर, उपयोगकर्ता ऑनबोर्डिंग स्क्रीन देखता है; उन्हें पूरा करने के बाद, UserDefaults में एक फ़्लैग सहेजा जाता है। बाद के लॉन्च पर, ऑनबोर्डिंग छोड़ दिया जाता है। SwiftUI के लिए @AppStorage का उपयोग किया जाता है; UIKit के लिए UserDefaults.standard तक सीधी पहुँच।
आइए एक OnboardingManager बनाएँ जो ऑनबोर्डिंग स्थिति संग्रहीत करने के लिए UserDefaults के साथ काम को encapsulate करता है। प्रबंधक स्थिति जाँचने के लिए isOnboardingCompleted गुण और फ़्लैग सेट करने के लिए markOnboardingCompleted विधि प्रदान करता है। टाइपो त्रुटियों को रोकने के लिए स्टोरेज कुंजी को एक स्थिरांक में निकाला गया है। यूनिट परीक्षण के लिए, प्रबंधक UserDefaultsProtocol का उपयोग करता है, जो वास्तविक स्टोरेज को MockUserDefaults से बदलने की अनुमति देता है।
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)
}
}
// एप्लिकेशन में उपयोग
let onboardingManager = OnboardingManager()
if !onboardingManager.isOnboardingCompleted {
showOnboarding()
} else {
showMainScreen()
}
अधिक जटिल सेटिंग्स, जैसे संरचित Profile ऑब्जेक्ट, संग्रहीत करने के लिए Codable प्रोटोकॉल और JSONEncoder/JSONDecoder का उपयोग करने की अनुशंसा की जाती है। ऑब्जेक्ट JSONEncoder के माध्यम से Data में सीरियलाइज़ होता है, set(_:forKey:) के माध्यम से सहेजा जाता है, और पढ़ते समय JSONDecoder के माध्यम से Data से वापस ऑब्जेक्ट में डीसीरियलाइज़ होता है। यह दृष्टिकोण टाइप सुरक्षा खोए बिना UserDefaults में जटिल संरचनाओं को संग्रहीत करने की अनुमति देता है।
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)
}
}
// उपयोग
let profile = UserProfile(name: "अन्ना", age: 28, preferences: ["theme": "dark"])
UserDefaults.standard.save(profile, forKey: "user_profile")
let loaded = UserDefaults.standard.load(UserProfile.self, forKey: "user_profile")
यह याद रखना महत्वपूर्ण है कि NSUserDefaults बड़ी मात्रा में डेटा संग्रहीत करने के लिए डिज़ाइन नहीं किया गया है। Apple संग्रहीत डेटा को कुछ दर्जन किलोबाइट तक सीमित रखने की अनुशंसा करता है। बड़ी वस्तुओं (चित्र, दस्तावेज़, सीरियलाइज़्ड मॉडल) को संग्रहीत करने के लिए, Documents निर्देशिका के साथ FileManager या CoreData का उपयोग करें। इसके अतिरिक्त, UserDefaults डेटा स्कीमा वर्ज़निंग का समर्थन नहीं करता — जब Codable मॉडल संरचना बदलती है, तो पुराना डेटा डीसीरियलाइज़ होने में विफल हो सकता है, और इसे एप्लिकेशन कोड में संभाला जाना चाहिए।
अक्सर पूछे जाने वाले प्रश्न
दोनों की-वैल्यू स्टोर हैं, लेकिन NSUserDefaults अधिक प्रकारों (Data, Date, Array, Dictionary) का समर्थन करता है और स्वचालित रूप से iCloud के साथ सिंक होता है। SharedPreferences डेटा XML में संग्रहीत करता है, NSUserDefaults plist प्रारूप में। NSUserDefaults में कैस्केडिंग लुकअप के साथ डोमेन प्रणाली है, जबकि SharedPreferences फ़ाइल नामों के साथ सरल फ्लैट संरचना का उपयोग करता है।
नहीं, NSUserDefaults डेटा को बिना एन्क्रिप्शन के सादे पाठ में संग्रहीत करता है। पासवर्ड, टोकन और एन्क्रिप्शन कुंजियों के लिए Keychain का उपयोग करें जो Secure Enclave स्तर पर डेटा एन्क्रिप्ट करता है। Keychain रहस्य पढ़ने से पहले बायोमेट्रिक प्रमाणीकरण (Face ID / Touch ID) जैसे एक्सेस गुणों का भी समर्थन करता है।
एक ही उपयोगकर्ता के उपकरणों के बीच सिंक करने के लिए NSUbiquitousKeyValueStore — iCloud क्लाउड की-वैल्यू स्टोरेज का उपयोग करें। एक उपकरण पर इस सेवा में लिखा गया डेटा उसी iCloud खाते वाले अन्य सभी उपकरणों पर स्वचालित रूप से दिखाई देता है। अधिकतम क्षमता: 1 MB प्रति एप्लिकेशन, 1024 कुंजियाँ।
सभी डेटा हटाने के लिए, एप्लिकेशन के Bundle Identifier के साथ removePersistentDomain(forName:) विधि को कॉल करें। व्यक्तिगत मान हटाने के लिए removeObject(forKey:) का उपयोग करें। पूर्ण सेटिंग्स रीसेट के लिए: UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)। सभी विलोपन तुरंत इन-मेमोरी कैश पर लागू होते हैं।
Apple NSUserDefaults के आकार पर कोई सख्त सीमा नहीं लगाता, लेकिन सभी संग्रहीत डेटा की कुल मात्रा 100 KB से अधिक न करने की अनुशंसा की जाती है। बड़ी मात्रा के लिए CoreData या FileManager का उपयोग करें। 1 MB से अधिक डेटा संग्रहीत करने पर, एप्लिकेशन लॉन्च के समय पढ़ने का प्रदर्शन काफी कम हो सकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें