WidgetKit هو إطار عمل من Apple تم تقديمه في iOS 14، والذي يسمح للمطورين بوضع أدوات ديناميكية على الشاشة الرئيسية لـ iPhone وiPad وسطح مكتب Mac ووجه Apple Watch. تعرض الأدوات المعلومات الرئيسية دون فتح التطبيق «توقعات الطقس، أسعار العملات، التقويم، الخطوات». وفقًا لـ Apple Developer Documentation, 2026، يقوم WidgetKit بمعالجة ما يصل إلى 2 مليار تحديث للأدوات يوميًا في نظام Apple البيئي، مما يجعله واحدًا من أكثر أطر العمل استخدامًا لعرض المعلومات على شاشات النظام.
أهم النقاط
WidgetKit هو إطار عمل من Apple لإنشاء أدوات تعرض المحتوى على شاشات النظام لأجهزة Apple. الأداة هي تمثيل مصغر لتطبيقك يقوم المستخدم بوضعه على الشاشة الرئيسية في وضع jiggle. على عكس تعقيدات watchOS التي كانت موجودة قبل WidgetKit، وحدّ الإطار الجديد إنشاء الأدوات لجميع منصات Apple من خلال واجهة برمجة تطبيقات موحدة على SwiftUI.
يعتمد مبدأ عمل WidgetKit على TimelineProvider — كائن ينشئ مصفوفة مرتبة من TimelineEntry، حيث يحتوي كل إدخال على Snapshot (حالة محددة للتطبيق الصغير في وقت معين). يعرض النظام الإدخالات بالتسلسل، مع تحديث التطبيق الصغير عند الانتقال إلى الإدخال التالي على الخط الزمني. بين الإدخالات، لا يستدعي WidgetKit كود التطبيق — يتم استهلاك وقت المعالج فقط عند إنشاء Timeline جديد.
وفقًا لجلسة WWDC 2024 «WidgetKit: What’s new»، يمتلك المستخدم العادي لنظام iOS من 8 إلى 12 أداة على شاشته الرئيسية، وأكثر الفئات شيوعًا هي الطقس والوقت والتقويم واللياقة البدنية والمالية. يستهلك WidgetKit أقل من 1% من شحن البطارية يوميًا مع الاستخدام النموذجي، وذلك بفضل التحديثات المجدولة بدلاً من التحديثات في الوقت الفعلي.
قبل iOS 14، كانت الأدوات موجودة فقط كـ Today View — لوحة يمكن الوصول إليها عن طريق التمرير لليسار من الشاشة الأولى. كانت Today Extensions ذات قيود خطيرة: كانت متاحة فقط على شاشة «اليوم»، وتطلبت فتح التطبيق لتحديث المحتوى، وكان دعم الأحجام محدودًا. WidgetKit استبدل Today Extensions بالكامل، حيث وفر أدوات على الشاشة الرئيسية وشاشة القفل (iOS 16+) وسطح مكتب Mac.
تعتمد هندسة WidgetKit على ثلاثة بروتوكولات رئيسية: TimelineProvider وTimelineEntry وWidget. TimelineEntry هو نموذج بيانات يمثل حالة التطبيق الصغير في وقت محدد. TimelineProvider ينشئ مصفوفة من هذه الإدخالات (Timeline)، مع تحديد تاريخ التفعيل لكل منها. Widget هو نقطة الدخول التي تربط المزوّد بعرض SwiftUI.
طريقة Timeline getTimeline يتم استدعاؤها بواسطة النظام عند إضافة التطبيق الصغير لأول مرة، ثم بشكل دوري — عادة كل 1–6 ساعات اعتمادًا على نوع المزوّد. يمكن أن يحتوي Timeline على إدخالات لساعات أو أيام مقدمًا، مما يسمح للتطبيق الصغير بالعمل دون استدعاء كود التطبيق بين التحديثات. إذا كانت هناك حاجة لتحديث عاجل (على سبيل المثال، تغير سعر العملة)، يمكن للتطبيق استدعاء WidgetCenter.shared.reloadAllTimelines() قسرًا.
struct SimpleEntry: TimelineEntry {
let date: Date
let value: Double
}
struct Provider: TimelineProvider {
typealias Entry = SimpleEntry
func placeholder(in context: Context) -> Entry {
Entry(date: Date(), value: 0)
}
func getSnapshot(
in context: Context,
completion: @escaping (Entry) -> Void
) {
Entry(date: Date(), value: 42.5)
}
func getTimeline(
in context: Context,
completion: @escaping (Timeline<Entry>, Error?) -> Void
) {
let entry = Entry(date: Date(), value: fetchLatestValue())
let nextUpdate = Calendar.current
.date(byAdding: .hour, value: 1, to: Date())!
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline, nil)
}
}
يدعم WidgetKit ثلاثة أحجام للأدوات، لكل منها نسب ثابتة. Small (170×170 نقطة على iPhone) يعرض معلومات مضغوطة — قيمة واحدة أو أيقونة أو نص قصير. Medium (364×170 نقطة) أعرض بمرتين من small ومناسب لعرض زوج من القيم أو رسم بياني مصغر. Large (364×382 نقطة) يشغل نصف الشاشة تقريبًا رأسيًا ويسمح بعرض الجداول أو القوائم أو البيانات الموسعة.
يجب على المطور دعم حجمين على الأقل — توصي Apple بـ small + medium. الأداة Large مطلوبة فقط إذا كان التطبيق يحتوي على محتوى كافٍ لملء هذا الحجم. يحصل كل حجم على عرض SwiftUI الخاص به، والذي يقوم WidgetKit بعرضه على شاشة النظام. من المهم أن WidgetKit لا يدعم الأحجام المخصصة — فقط ثلاثة أحجام ثابتة، مما يضمن اتساق الواجهة.
struct WeatherWidget: Widget {
let kind: String = "WeatherWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
WeatherWidgetView(entry: entry)
}
.configurationDisplayName("Weather")
.description("Current temperature and forecast")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
يقدم WidgetKit نوعين من التهيئة — StaticConfiguration وIntentConfiguration. StaticConfiguration مناسب للأدوات التي تعرض نفس المحتوى لجميع المستخدمين: أسعار العملات والطقس والتقويم. IntentConfiguration يسمح للمستخدم بتخصيص الأداة عند إضافتها من خلال نظام intents في Siri — على سبيل المثال، اختيار مدينة معينة للطقس أو مؤشر معين لأسعار الأسهم.
يستخدم IntentConfiguration INWidgetIntent — فئة فرعية من INIntent من SiriKit. عندما يضيف المستخدم أداة ويختار معايير (مثل المدينة)، يحفظ النظام هذا intent ويمرره إلى TimelineProvider في كل تحديث. يستلم المزوّد intent في طريقة getTimeline ويستخدم معاييره لتكوين المحتوى. IntentConfiguration هو الأسلوب المفضل للأدوات المخصصة، حيث يتكامل مع Siri وShortcuts.
struct WeatherWidgetEntryView: View {
var entry: WeatherEntry
var body: some View {
VStack(alignment: .leading) {
Text(entry.cityName)
.font(.caption)
.foregroundColor(.secondary)
Text("\(entry.temperature)°C")
.font(.largeTitle)
}
}
}
struct WeatherWidget: Widget {
var body: some WidgetConfiguration {
IntentConfiguration(
kind: "WeatherWidget",
intent: WeatherConfigIntent.self,
provider: WeatherTimelineProvider()
) { entry in
WeatherWidgetEntryView(entry: entry)
}
}
}
يبدأ إنشاء أداة بإضافة Widget Extension Target في Xcode: File ← New ← Target ← Widget Extension. يقوم Xcode تلقائيًا بإنشاء هيكل مع TimelineEntry وTimelineProvider وWidgetConfiguration. يتبقى على المطور فقط تنفيذ عرض SwiftUI لعرض البيانات وتهيئة المزوّد لجدول تحديث صحيح.
أدناه مثال كامل لأداة بسيطة لعرض سعر Bitcoin الحالي: Provider يقوم بتحميل السعر عبر URLSession وينشئ Timeline مع تحديثات كل ساعة. يعرض WidgetSwiftUIView السعر بخط كبير ووقت آخر تحديث بخط صغير.
struct BTCPriceEntry: TimelineEntry {
let date: Date
let price: Double
let change24h: Double
}
struct BTCWidgetEntryView: View {
var entry: BTCPriceEntry
var body: some View {
VStack {
Text("BTC/USD").font(.caption)
Text("$\(entry.price, specifier: "%.0f")")
.font(.title2).fontWeight(.bold)
Text(entry.change24h > 0 ? "+" : "")
}
}
}
مع iOS 16، وسّع WidgetKit الدعم ليشمل شاشة القفل — شاشة قفل iPhone. أدوات شاشة القفل من نوعين: inline (سطر واحد من النص أسفل الساعة) وrectangular (منطقة مستطيلة). على عكس أدوات الشاشة الرئيسية، يتم تحديث أدوات شاشة القفل بشكل متكرر — يسمح مشغل النظام بتحديثها كل 15–30 دقيقة لعرض المعلومات الحالية دون فتح القفل.
تتطلب أدوات شاشة القفل تهيئة منفصلة عبر WidgetConfiguration مع accessoryFamilies: accessoryCircular وaccessoryRectangular وaccessoryInline. هذه العائلات لها قيود صارمة على الحجم والمحتوى — لا تدعم الصور أو الرسوم المتحركة أو الخطوط المخصصة. توصي Apple باستخدام المعلومات النصية فقط وأيقونات النظام SF Symbols لأدوات شاشة القفل.
عند تطوير الأدوات، من المهم مراعاة قيود WidgetKit. الأدوات هي عروض للقراءة فقط: لا تعالج أحداث اللمس (باستثناء النقرة التي تفتح التطبيق). لا تدعم الأدوات الرسوم المتحركة أو الفيديو أو إدخال لوحة المفاتيح أو التمرير أو العناصر التفاعلية. كل أداة هي لقطة ثابتة للبيانات في وقت معين، وأي محاولة لإضافة تفاعل ستؤدي إلى رفض التطبيق من App Store.
تشمل أفضل الممارسات استخدام Widget Center للتحديثات القسرية، وتخزين البيانات مؤقتًا على مستوى TimelineProvider للاستجابة السريعة، واستخدام placeholders للحالة الأولية. من المهم أيضًا دعم أحجام متعددة — يتوقع المستخدم أن تكون الأداة متاحة في كل من الإصدارين small وmedium. تجنب عرض بيانات غير دقيقة أو قديمة — يتذكر المستخدم المعلومات الخاطئة من الأدوات لفترة طويلة.
| ما هو غير مسموح | لماذا |
|---|---|
| الرسوم المتحركة والفيديو | الأدوات لقطات ثابتة؛ الحركة تستنزف البطارية |
| التفاعل | WidgetKit لا يدعم عناصر واجهة المستخدم باستثناء روابط التطبيق |
| التمرير | حجم ثابت بدون تمرير |
| لوحة المفاتيح | إدخال النص في الأدوات غير ممكن |
| البيانات المباشرة | يتم تحديث البيانات وفقًا لجدول Timeline، وليس في الوقت الفعلي |
| الأحجام المخصصة | فقط الأحجام الثابتة small, medium, large, accessory* |
الأسئلة الشائعة
نعم، WidgetKit متعدد المنصات. يمكن تضمين نفس Widget Extension في أهداف iOS وiPadOS وmacOS بكود SwiftUI واحد. تظهر الاختلافات فقط في العائلات المدعومة — لا يحتوي Mac على accessoryRectangular.
وفقًا لجدول Timeline. يحدد المطور موعد التحديث التالي — بعد دقيقة أو يوم. يمكن للنظام أيضًا تسريع التحديثات للأدوات كثيرة الاستخدام.
لا، WidgetKit لا يدعم UIButton أو أي عناصر تفاعلية. الإجراء الوحيد هو النقر على الأداة، مما يفتح التطبيق عبر رابط عميق.
استخدم WidgetCenter.shared.reloadAllTimelines() أو reloadTimelines(ofKind:) لأداة محددة. الاستدعاء من التطبيق يطلب فورًا Timeline جديد من المزوّد.
بأقل درجة — أقل من 1% شحن يوميًا مع الاستخدام النموذجي. يحد WidgetKit من التحديثات في الخلفية ولا يبقي التطبيق نشطًا. الاستهلاك الرئيسي هو إنشاء Timeline عند الإضافة الأولى.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.