SwiftUI में @AppStorage एक property wrapper है जो UserDefaults के साथ काम करने के लिए है और स्वचालित रूप से मान को UI से सिंक करता है। @AppStorage के माध्यम से घोषित प्रॉपर्टी बदलने पर, नया मान तुरंत UserDefaults में सेव हो जाता है, और जब UserDefaults बाहरी रूप से — विजेट या एक्सटेंशन द्वारा — बदलता है, तो View स्वचालित रूप से रीड्रा हो जाता है। Apple Developer Documentation (2025) के अनुसार, @AppStorage String, Int, Double, Bool, Data, URL और उनके ऑप्शनल वर्जन को सपोर्ट करता है, बिना मैन्युअल ऑब्ज़र्वेशन कोड के यूज़र सेटिंग्स का रिएक्टिव स्टोरेज प्रदान करता है।
मुख्य बिंदु
@AppStorage Apple द्वारा iOS 14 में पेश किया गया एक property wrapper है जो View प्रॉपर्टी को UserDefaults की एक कुंजी से बाँधता है। प्रॉपर्टी पढ़ने पर, SwiftUI निर्दिष्ट कुंजी द्वारा UserDefaults से मान लोड करता है। लिखने पर, नया मान सेव करता है और View को रीड्रा करने की सूचना देता है।
@AppStorage से पहले, डेवलपर्स को onAppear में मैन्युअल रूप से UserDefaults पढ़ना, UserDefaults.didChangeNotification की सदस्यता लेना, और बदलावों पर @State अपडेट करना पड़ता था। @AppStorage पूरे चक्र को स्वचालित करता है: एक-लाइन घोषणा 15–20 लाइनों के boilerplate कोड को बदल देती है। इसके अलावा, @AppStorage द्विदिश सिंक्रनाइज़ेशन प्रदान करता है — यदि UserDefaults मान किसी अन्य प्रक्रिया (जैसे App Extension या Widget) से बदलता है, तो View फिर भी अपडेट प्राप्त करेगा।
आर्किटेक्चरल रूप से, @AppStorage को DynamicProperty के रूप में लागू किया गया है, जो SwiftUI को निर्भरताओं को ट्रैक करने और देखे गए मान में बदलाव पर View को रीड्रा करने की अनुमति देता है। यह इसे यूज़र सेटिंग्स: इंटरफ़ेस भाषा, सुविधाओं को सक्षम/अक्षम करना, अंतिम चयनित टैब, उपयोगकर्ता नाम संग्रहीत करने के लिए आदर्श बनाता है।
यद्यपि @AppStorage अंतर्निहित रूप से UserDefaults का उपयोग करता है, स्टोरेज के साथ काम करने के दृष्टिकोण मौलिक रूप से भिन्न हैं। UserDefaults एक निम्न-स्तरीय API है जिसके लिए पढ़ने, लिखने और बदलाव सूचनाओं के मैन्युअल प्रबंधन की आवश्यकता होती है। @AppStorage एक SwiftUI एब्स्ट्रैक्शन है जो बॉक्स से बाहर रिएक्टिव व्यवहार प्रदान करता है।
UserDefaults एकबारगी संचालन के लिए उपयुक्त है: ऐप स्टार्टअप पर सेटिंग्स लोड करना, एनालिटिक्स लिखना, टोकन कैश करना। @AppStorage उन सेटिंग्स के लिए है जिन्हें UI को रिएक्टिव रूप से अपडेट करना चाहिए: थीम टॉगल, भाषा चयन, इंटरफ़ेस स्थिति सहेजना। View के अंदर सीधे UserDefaults का उपयोग करना एक एंटी-पैटर्न है, क्योंकि View अतिरिक्त सदस्यता के बिना बदलावों के बारे में नहीं जानता।
| पैरामीटर | @AppStorage | UserDefaults |
|---|---|---|
| प्रतिक्रियाशीलता | स्वचालित | सूचनाओं की सदस्यता आवश्यक |
| Boilerplate | 1 पंक्ति प्रति प्रॉपर्टी | 15–20 पंक्तियाँ प्रति प्रॉपर्टी |
| प्रकार | String, Int, Double, Bool, Data, URL | सभी प्रकार + आर्काइव्ड ऑब्जेक्ट |
| कस्टम प्रकार | RawRepresentable के माध्यम से | NSKeyedArchiver के माध्यम से |
| App Extension | स्वचालित सिंक | मैन्युअल सदस्यता |
रिएक्टिव UI वाली सरल सेटिंग्स के लिए @AppStorage पसंदीदा विकल्प है। जटिल डेटा (ऐरे, डिक्शनरी, कस्टम ऑब्जेक्ट) के लिए UserDefaults को @State और मैन्युअल बदलाव सदस्यता के साथ संयोजन में उपयोग करें, या संरचित स्टोरेज के लिए SwiftData / Core Data पर स्विच करें।
@AppStorage मानक प्रकारों का समर्थन करता है जिन्हें UserDefaults सीधे सीरियलाइज़ कर सकता है: String, Int, Double, Bool, Data, URL. प्रत्येक प्रकार के लिए एक ऑप्शनल वर्जन (String?, Int?, Double?, Bool?, Data?, URL?) मौजूद है, जो "सेट नहीं" और "खाली मान" के बीच अंतर करने की अनुमति देता है।
RawRepresentable प्रोटोकॉल का अनुपालन करने वाले कस्टम प्रकारों को संग्रहीत करने के लिए, @AppStorage स्वचालित रूप से भी काम करता है। यदि किसी enum का rawValue String या Int प्रकार का है, तो इसका सीधे उपयोग किया जा सकता है: @AppStorage("theme") var theme: AppTheme = .system. SwiftUI स्वचालित रूप से rawValue के माध्यम से मान को सीरियलाइज़/डीसीरियलाइज़ करता है।
enum AppTheme: String {
case system, light, dark
}
struct SettingsView: View {
@AppStorage("username") var username: String = "Guest"
@AppStorage("launchCount") var launchCount: Int = 0
@AppStorage("isDarkMode") var isDarkMode: Bool = false
@AppStorage("appTheme") var theme: AppTheme = .system
@AppStorage("lastOpened") var lastOpened: Date? = nil
var body: some View {
Form {
TextField("Username", text: $username)
Toggle("Dark mode", isOn: $isDarkMode)
Text("\(launchCount) बार लॉन्च किया गया")
}
}
}
उदाहरण विभिन्न @AppStorage प्रकारों का उपयोग करता है: डिफ़ॉल्ट मान "Guest" के साथ String, लॉन्च काउंटर के लिए Int, डार्क थीम के लिए Bool, String प्रकार के rawValue के साथ AppTheme enum, और अंतिम खुलने के समय के लिए ऑप्शनल Date?। प्रत्येक प्रॉपर्टी पहले तर्क के रूप में निर्दिष्ट UserDefaults कुंजी से बंधी है। यदि पहले लॉन्च पर कुंजी स्टोरेज में मौजूद नहीं है तो डिफ़ॉल्ट मान उपयोग किया जाता है।
@AppStorage के प्रमुख लाभों में से एक किसी भी स्रोत से UserDefaults बदलावों का स्वचालित अवलोकन है। यदि कोई App Extension या Widget मान बदलता है, तो पैरेंट ऐप में @AppStorage सूचना प्राप्त करता है और View को रीड्रा करता है। यह KVO (Key-Value Observing) तंत्र के माध्यम से प्राप्त होता है जिसे @AppStorage स्वचालित रूप से UserDefaults.didChangeNotification पर सेट करता है।
व्यवहार में, इसका मतलब है कि यदि उपयोगकर्ता Widget में कोई सेटिंग बदलता है (उदाहरण के लिए, डार्क थीम सक्षम करता है), तो ऐप तुरंत बदलाव को पकड़ लेता है। वही सिंक्रनाइज़ेशन मुख्य ऐप और Share Extension, Watch App या Today Widget के बीच काम करता है। डेवलपर को अंतर-प्रक्रिया डेटा विनिमय के लिए कोड लिखने की आवश्यकता नहीं है — @AppStorage यह स्वचालित रूप से करता है।
struct ThemeSettingView: View {
@AppStorage("isDarkMode") var isDarkMode: Bool = false
var body: some View {
VStack {
Toggle("Dark Mode", isOn: $isDarkMode)
.onChange(of: isDarkMode) { oldValue, newValue in
print("डार्क मोड बदलकर \(newValue) हो गया")
}
}
}
}
Toggle @AppStorage के माध्यम से $isDarkMode से बंधा है। टॉगल करने पर, मान स्वचालित रूप से "isDarkMode" कुंजी के तहत UserDefaults में सेव हो जाता है। .onChange मॉडिफ़ायर बदलाव पर साइड इफ़ेक्ट करने की अनुमति देता है — उदाहरण के लिए, एनालिटिक्स भेजना या अन्य स्क्रीन का UI अपडेट करना। यदि Widget उसी कुंजी को बदलता है, तो @AppStorage भी onChange को ट्रिगर करेगा, जिससे स्थिति की संगति सुनिश्चित होती है।
आइए एक पूर्ण ऐप सेटिंग्स स्क्रीन देखें जो सभी कॉन्फ़िगरेशन को संग्रहीत करने के लिए @AppStorage का उपयोग करती है। फ़ॉर्म में विभिन्न प्रकार की सेटिंग्स वाले अनुभाग हैं: टेक्स्ट फ़ील्ड, टॉगल, काउंटर — सभी मान स्वचालित रूप से UserDefaults में सेव होते हैं।
struct AppSettingsView: View {
@AppStorage("displayName") var displayName = ""
@AppStorage("notificationsEnabled") var notificationsEnabled = true
@AppStorage("maxResults") var maxResults = 25
@AppStorage("selectedTab") var selectedTab = "home"
var body: some View {
NavigationStack {
Form {
Section(header: Text("प्रोफ़ाइल")) {
TextField("Display name", text: $displayName)
}
Section(header: Text("प्राथमिकताएँ")) {
Toggle("Enable notifications",
isOn: $notificationsEnabled)
Stepper("Max results: \(maxResults)",
value: $maxResults,
in: 10...100,
step: 5)
}
Section {
Button("सेटिंग्स रीसेट करें") {
UserDefaults.standard.removePersistentDomain(
forName: Bundle.main.bundleIdentifier!)
}
.tint(.red)
}
}
.navigationTitle("Settings")
}
}
}
फ़ॉर्म में विभिन्न प्रकारों के चार @AppStorage गुण हैं: नाम के लिए String, सूचनाओं के लिए Bool, परिणामों की संख्या के लिए Int और चयनित टैब के लिए String। सभी नियंत्रण Binding ($displayName, $notificationsEnabled, आदि) के माध्यम से गुणों से बंधे हैं। "Reset settings" बटन ऐप डोमेन को हटाकर सभी UserDefaults को साफ़ करता है — उसके बाद @AppStorage स्वचालित रूप से डिफ़ॉल्ट मानों पर वापस आ जाता है।
struct SharedSettingsView: View {
let sharedDefaults = UserDefaults(suiteName: "group.com.example.app")
@AppStorage("widgetTheme", store: UserDefaults(suiteName: "group.com.example.app")!)
var widgetTheme: String = "सिस्टम"
@AppStorage("widgetColor", store: UserDefaults(suiteName: "group.com.example.app")!)
var widgetColor: String = "नीला"
var body: some View {
Form {
Picker("Widget theme", selection: $widgetTheme) {
Text("सिस्टम").tag("system")
Text("लाइट").tag("लाइट")
Text("डार्क").tag("डार्क")
}
Picker("Accent color", selection: $widgetColor) {
Text("नीला").tag("blue")
Text("हरा").tag("हरा")
Text("लाल").tag("लाल")
}
}
}
}
App Group (ऐप और एक्सटेंशन के बीच साझा स्टोरेज) के लिए @AppStorage store पैरामीटर स्वीकार करता है: UserDefaults(suiteName:)। मान साझा कंटेनर में सेव होते हैं जो मुख्य ऐप, Widget, Watch App और उसी समूह के अन्य एक्सटेंशन के लिए उपलब्ध होता है। Widget इन सेटिंग्स को पढ़ सकता है, और जब वे ऐप में बदलती हैं, तो Widget UserDefaults अवलोकन तंत्र के माध्यम से स्वचालित रूप से अपडेट हो जाता है।
अक्सर पूछे जाने वाले प्रश्न
@State मान केवल मेमोरी में संग्रहीत करता है और ऐप पुनरारंभ होने पर रीसेट हो जाता है। @AppStorage मान को UserDefaults में सहेजता है और अगले लॉन्च पर पुनर्स्थापित करता है। अस्थायी स्क्रीन डेटा के लिए @State का उपयोग करें, उन सेटिंग्स के लिए @AppStorage जो पुनरारंभ होने पर बनी रहनी चाहिए।
हाँ, यदि Enum String या Int प्रकार के rawValue के साथ RawRepresentable प्रोटोकॉल लागू करता है। उदाहरण: @AppStorage("theme") var theme: AppTheme = .system. SwiftUI स्वचालित रूप से rawValue के माध्यम से enum को सीरियलाइज़ करता है और लोड होने पर पुनर्स्थापित करता है।
मानक स्टोरेज के लिए UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) या किसी विशिष्ट कुंजी के लिए removeObject(forKey:) कॉल करें। साफ़ करने के बाद, सभी @AppStorage गुण घोषणा में निर्दिष्ट डिफ़ॉल्ट मानों पर वापस आ जाएँगे।
हाँ, ऐप और एक्सटेंशन के बीच सिंक्रनाइज़ेशन के लिए App Group का उपयोग करें: @AppStorage("key", store: UserDefaults(suiteName: "group.com.example.app")!). Widget, Share Extension और Watch App उसी UserDefaults को पढ़ और लिख सकते हैं, और बदलाव स्वचालित रूप से ट्रैक किए जाते हैं।
@AppStorage UserDefaults का उपयोग करता है, जो छोटी मात्रा के डेटा: सेटिंग्स, टोकन, काउंटर के लिए डिज़ाइन किया गया है। अनुशंसित सीमा प्रति ऐप 100 KB तक है। संरचित या बड़े डेटा (ऑब्जेक्ट ऐरे, मीडिया फ़ाइलें) के लिए SwiftData, Core Data या फ़ाइल सिस्टम का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें