iOS-Widget-Development-Kit
عروض SwiftUI (views) ومساعدات لودجات WidgetKit والرسوم البيانية والـ timelines وApp Intents وLive Activities
الترخيص: MIT
WidgetDevelopmentKit حزمة Swift للمطوّرين الذين يبنون ودجات لتطبيقات iOS الخاصة بهم. تحتوي على عروض SwiftUI جاهزة لودجات الشاشة الرئيسية (Home Screen) وشاشة القفل (Lock Screen) وStandBy، وعروض رسوم بيانية مخصّصة بحجم الودجات، ومساعدات للـ timelines وللبيانات التي يشاركها التطبيق مع ودجته، وApp Intents لأزرار الودجات، وسمات (attributes) وعروض ActivityKit لـ Live Activities. تظل أنت من يكتب امتداد الودجة (widget extension)؛ وتوفّر لك الحزمة العروض ومنطق التاريخ والتخزين وإعادة المحاولة الذي تحتاجه كل ودجة. لا تحتوي على أي اعتماديات من جهات خارجية.
الميزات
- قوالب الشاشة الرئيسية مثل الطقس والإحصاءات والمالية والتقويم والعدّ التنازلي والساعة وحلقات اللياقة ومتابع العادات والمهام والماء، بالإضافة إلى 9 عروض Swift Charts مخصّصة بحجم الودجات
- 15 عرض accessory لشاشة القفل (دائري circular، ومستطيل rectangular، ومضمّن inline) و7 عروض لـ StandBy
- مساعدات الـ timeline: تواريخ entry، وسياسات إعادة التحميل (reload policies) التي تستخدم حسابات التقويم، ومخزن snapshot له مدة انتهاء للبيانات المشتركة عبر App Group
- ودجات تفاعلية: 5 App Intents و8 عروض بأزرار تشغّلها
- Live Activities: 10 أنواع من ActivityAttributes بعروض لشاشة القفل وDynamic Island المضغوطة (compact)، وآلة حالات (state machine) ترفض التحديثات غير المرتَّبة
- محمّل بيانات يعيد المحاولة فقط عند الأخطاء المؤقتة (408 و5xx وtimeouts وoffline) ويفشل بسرعة داخل امتداد الودجة
- منطق التاريخ والأرقام وإعادة المحاولة مغطّى باختبارات Swift Testing، بما يشمل NaN والأهداف الصفرية وأيام التوقيت الصيفي؛ ويحافظ اختبار على تزامن كتل الكود في README مع الكود المُجمَّع
البدء السريع
1struct LaunchEntry: TimelineEntry {2 let date: Date3}4 5struct LaunchProvider: TimelineProvider {6 func placeholder(in context: Context) -> LaunchEntry {7 LaunchEntry(date: .now)8 }9 10 func getSnapshot(in context: Context, completion: @escaping (LaunchEntry) -> Void) {11 completion(LaunchEntry(date: .now))12 }13 14 func getTimeline(in context: Context, completion: @escaping (Timeline<LaunchEntry>) -> Void) {15 // One entry per hour for the next six hours, then WidgetKit asks again.16 let entries = TimelineSchedule.dates(from: .now, every: 60 * 60, count: 6).map(LaunchEntry.init)17 completion(Timeline(entries: entries, policy: .atEnd))18 }19}20 21struct LaunchCountdownWidget: Widget {22 let launchDay = DateComponents(calendar: .current, year: 2027, month: 1, day: 1).date ?? .now23 24 var body: some WidgetConfiguration {25 StaticConfiguration(kind: "launch", provider: LaunchProvider()) { entry in26 CountdownWidget(title: "Launch", targetDate: launchDay, referenceDate: entry.date)27 }28 .configurationDisplayName("Countdown")29 .supportedFamilies([.systemSmall])30 }31}التثبيت
Xcode (File › Add Package Dependencies…)
1https://github.com/muhittincamdali/iOS-Widget-Development-Kit.gitSwift Package Manager
1dependencies: [2 .package(url: "https://github.com/muhittincamdali/iOS-Widget-Development-Kit.git", from: "2.0.0")3],4targets: [5 .target(name: "YourApp", dependencies: [6 .product(name: "WidgetDevelopmentKit", package: "iOS-Widget-Development-Kit")7 ])8]لقطات الشاشة






الجدول الزمني
افتُتح المستودع
وُسم الإصدار v1.0.0؛ لا يُحمَّل البيان (manifest) عند هذا الوسم (tag)، فلا يمكن بناء هذا الإصدار
تم التبسيط إلى هدف مكتبة (library target) واحد من حوالي 240 سطرًا؛ وظل هدف الاختبار (test target) غير قابل للتجميع (compile)
أُعيد البناء والإصدار كـ 2.0.0 (PR #28): استُعيدت العروض من التاريخ وأُصلحت، وبيان Swift 6، واختبارات Swift Testing، وDocC، وتطبيق توضيحي (example app)، وCI