تكوين تطبيقات Swift (iOS/macOS): الأدوات والمكتبات
يعد تكوين التطبيقات جزءًا أساسيًا من التطوير لنظامي iOS وmacOS. فهو يتيح إدارة مرنة لسلوك التطبيق دون تغيير الكود، وضبط المعلمات لبيئات مختلفة (dev/staging/prod)، وتخصيص تجربة المستخدم. في هذه المقالة، سنستعرض الأدوات والمكتبات الرئيسية في Swift لإدارة التكوين.
1. الأدوات المدمجة في iOS/macOS
توفر Apple عدة آليات مدمجة لتخزين وقراءة بيانات التكوين.
1.1 PropertyList (Info.plist)
طريقة تقليدية لتخزين التكوين الثابت. يحتوي ملف Info.plist على الإعدادات الأساسية للتطبيق: الإصدار، معرف الحزمة، الاتجاهات المدعومة، إلخ.
// قراءة قيمة من Info.plistif let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String { print("إصدار التطبيق: \\(appVersion)")}
// قراءة مفتاح مخصصif let apiURL = Bundle.main.object(forInfoDictionaryKey: "APIBaseURL") as? String { print("عنوان URL الأساسي للـ API: \\(apiURL)")}1.2 UserDefaults
UserDefaults هي طريقة بسيطة لتخزين كميات صغيرة من البيانات (سلاسل نصية، أرقام، قيم منطقية). مثالية للإعدادات الشخصية للمستخدم.
// حفظUserDefaults.standard.set(true, forKey: "isDarkModeEnabled")UserDefaults.standard.set("ar", forKey: "appLanguage")
// قراءةlet isDarkMode = UserDefaults.standard.bool(forKey: "isDarkModeEnabled")let language = UserDefaults.standard.string(forKey: "appLanguage") ?? "en"1.3 SwiftUI @AppStorage
غلاف حديث فوق UserDefaults لـ SwiftUI. يسمح بمزامنة الحالة تلقائيًا مع واجهة المستخدم.
struct SettingsView: View { @AppStorage("isDarkMode") private var isDarkMode = false @AppStorage("username") private var username = "ضيف" var body: some View { Form { Toggle("الوضع الداكن", isOn: $isDarkMode) TextField("اسم المستخدم", text: $username) } }}2. مكتبات للتكوين المتقدم
2.1 Firebase Remote Config
تكوين سحابي من Google. يتيح تغيير معلمات التطبيق دون نشر تحديث في App Store.
import FirebaseRemoteConfig
class RemoteConfigManager { static let shared = RemoteConfigManager() private let remoteConfig = RemoteConfig.remoteConfig() func setup() { let defaults: [String: NSObject] = [ "welcome_message": "مرحبًا بك!" as NSObject, "max_items_count": 20 as NSObject ] remoteConfig.setDefaults(defaults) remoteConfig.fetch(withExpirationDuration: 3600) { status, error in if status == .success { self.remoteConfig.activate() } } } var welcomeMessage: String { remoteConfig.configValue(forKey: "welcome_message").stringValue ?? "" } var maxItemsCount: Int { Int(remoteConfig.configValue(forKey: "max_items_count").numberValue ?? 20) }}2.2 SwiftyUserDefaults
غلاف مناسب لـ UserDefaults مع دعم Codable ومفاتيح آمنة من حيث النوع.
import SwiftyUserDefaults
extension DefaultsKeys { static let isFirstLaunch = DefaultsKey<Bool>("isFirstLaunch", defaultValue: true) static let userProfile = DefaultsKey<Data?>("userProfile")}
struct UserProfile: Codable { let name: String let age: Int}
// الاستخدامDefaults[.isFirstLaunch] = false
let profile = UserProfile(name: "إيفان", age: 30)if let data = try? JSONEncoder().encode(profile) { Defaults[.userProfile] = data}
if let profileData = Defaults[.userProfile], let decoded = try? JSO