تكوين تطبيقات Swift (iOS/macOS): نظرة عامة على الأدوات والمكتبات
يعد تكوين التطبيقات أحد الجوانب الرئيسية للتطوير لنظامي iOS وmacOS. تعتمد مرونة منتجك وقابليته للاختبار وأمانه على الإدارة الصحيحة للإعدادات. في هذه المقالة، سنستعرض آليات التكوين القياسية في Swift، بالإضافة إلى المكتبات والأدوات الشائعة التي تسهل إدارة معلمات التطبيق.
آليات التكوين المضمنة في Swift
1. Info.plist و Xcconfig
الطريقة الأساسية لتخزين البيانات الوصفية للتطبيق هي ملف Info.plist. يحتوي على إصدار الحزمة، والمعرّف، واسم التطبيق، ومعلمات النظام الأخرى. لإدارة أكثر مرونة للتكوين (على سبيل المثال، قيم مختلفة لـ Debug/Release)، يتم استخدام ملفات .xcconfig.
// Example.xcconfigAPP_NAME = MyAppAPI_BASE_URL = https://api.example.comBUNDLE_ID_SUFFIX = .devفي Swift، يمكن الحصول على هذه القيم عبر Bundle.main:
func getConfigValue(key: String) -> String? { guard let value = Bundle.main.object(forInfoDictionaryKey: key) as? String else { return nil } return value}
let baseURL = getConfigValue(key: "API_BASE_URL")2. UserDefaults
لتخزين إعدادات المستخدم (السمة، اللغة، حجم الخط)، يتم استخدام UserDefaults. هذه طريقة بسيطة وسريعة لحفظ كميات صغيرة من البيانات.
// حفظUserDefaults.standard.set(true, forKey: "isDarkMode")UserDefaults.standard.set("ru", forKey: "language")
// قراءةlet isDarkMode = UserDefaults.standard.bool(forKey: "isDarkMode")let language = UserDefaults.standard.string(forKey: "language") ?? "en"3. SwiftUI AppStorage
في SwiftUI، يوجد property wrapper مدمج @AppStorage والذي يتم مزامنته تلقائياً مع UserDefaults:
struct SettingsView: View { @AppStorage("isDarkMode") private var isDarkMode = false @AppStorage("fontSize") private var fontSize = 14.0
var body: some View { Form { Toggle("السمة الداكنة", isOn: $isDarkMode) Slider(value: $fontSize, in: 10...30) { Text("حجم الخط") } } }}مكتبات خارجية للتكوين
على الرغم من أن الأدوات القياسية تغطي السيناريوهات الأساسية، إلا أن المشاريع الحقيقية غالباً ما تتطلب حلولاً أكثر تقدماً. دعنا نستعرض بعض المكتبات الشائعة.
1. SwiftyUserDefaults
غلاف حول UserDefaults بمفاتيح محددة النوع ودعم Codable. يسمح بتجنب الأخطاء المتعلقة بالمفاتيح النصية.
- دعم جميع الأنواع القياسية و Codable
- توليد الكود عبر Sourcery (اختياري)
- صيغة بسيطة وموجزة
import SwiftyUserDefaults
extension DefaultsKeys { var isDarkMode: DefaultsKey<Bool> { .init("isDarkMode", defaultValue: false) } var userName: DefaultsKey<String?> { .init("userName") }}
// الاستخدامDefaults[\\.isDarkMode] = truelet name = Defaults[\\.userName] ?? "ضيف"2. PropertyKit
مكتبة لوصف التكوين بشكل تصريحي. تسمح بتجميع الإعدادات وإدارة ظهورها.
- دعم الأقسام والمجموعات المتداخلة
- التحقق من صحة القيم في الوقت الفعلي
- التكامل مع Combine لتحديث واجهة المستخدم التفاعلي
import PropertyKit
struct AppConfig: PropertyGroup { @Property(key: "api_url", default: "https://api.example.com") var apiURL: String
@Property(key: "max_retries", default: 3, validator: { $0 > 0 && $0 < 10 }) var maxRetries: Int
@Property(key: "feature_x_enabled", default: false) var featureXEnabled: Bool