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 کو سپورٹ کرنا شروع کیا — ایک ہی ڈویلپر کی ایپلیکیشنز اور ان کی توسیعات (widgets، watchOS کمپینئن ایپس) کے درمیان مشترکہ ذخیرہ۔ اس کے لیے App Group شناخت کنندہ کے ساتھ init?(suiteName:) انیشیلائزر استعمال کیا جاتا ہے۔ یہ مثال کے طور پر، Today widget کو محفوظ کرنے کی منطق کو نقل کیے بغیر مرکزی ایپلیکیشن سے سیٹنگز پڑھنے کی اجازت دیتا ہے۔
طبعی طور پر، NSUserDefaults ایک بائنری plist فائل میں محفوظ ہوتا ہے: {Sandbox}/Library/Preferences/com.example.myapp.plist۔ فائل کمپیکٹنس اور پڑھنے کی رفتار کے لیے بائنری plist فارمیٹ (NSPropertyListBinaryFormat_v1_0) استعمال کرتی ہے۔ macOS پر، فائل مطابقت کے لیے XML فارمیٹ میں ہو سکتی ہے۔ Android پر SharedPreferences کے برعکس، UserDefaults کی plist فائلیں Dictionary اور Array کے ذریعے nested ڈھانچے پر مشتمل ہو سکتی ہیں۔
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»۔ اس مثال میں لکھا گیا ڈیٹا مرکزی ایپلیکیشن، widget، 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 کے ساتھ کام کو سمیٹتا ہے۔ مینیجر حالت چیک کرنے کے لیے 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں