Today Widget یک افزونه iOS است که اطلاعات تعاملی را مستقیماً در مرکز اعلانات یا صفحه «امروز» نمایش میدهد. کاربر دادههای بهروز را میبیند — آبوهوا، نرخ ارز، تقویم — بدون باز کردن برنامه اصلی. طبق دادههای Apple WWDC (2025)، استفاده از WidgetKit پس از معرفی ویجتهای تعاملی در iOS 17، 40% افزایش یافته است. Today Widget مشکل دسترسی سریع به اطلاعات را حل میکند: یک نگاه به صفحه — و کاربر بدون پیمایش در برنامه، دادههای مورد نیاز را دریافت میکند.
نکات اصلی
Today Widget (همچنین به عنوان ویجت مرکز اعلانات شناخته میشود) — عنصری از رابط iOS است که اطلاعات فشردهای را از برنامه بدون راهاندازی آن نمایش میدهد. کاربر ویجت را با کشیدن صفحه به چپ در صفحه قفل یا صفحه اصلی میبیند. ویجت میتواند دادههای پویا را نمایش دهد — نرخ ارز، آخرین اخبار، وضعیت وظایف، وضعیت دستگاه.
از نظر تاریخی، Today Widget در iOS 8 به عنوان افزونه مرکز اعلانات و از طریق فریمورک Notification Center ظاهر شد. با iOS 14، Apple WidgetKit را معرفی کرد — معماری کاملاً بازطراحیشده که امکان قرار دادن ویجتها را مستقیماً روی صفحه اصلی فراهم میکند. Today Widget در مفهوم مدرن — یک ویجت WidgetKit است که در بخش «امروز» (بخش ویجتها در سمت چپ اولین صفحه) قرار گرفته است.
هدف اصلی کاهش زمان دسترسی به اطلاعات است. به جای باز کردن برنامه، پیمایش در منو و انتظار برای بارگذاری، کاربر بلافاصله دادههای مورد نیاز را میبیند. طبق دادههای Apple (2024)، برنامههای دارای ویجت 27% تعامل کاربری بیشتری نشان میدهند. سناریوهای اضافی: اقدامات سریع (علامتگذاری وظیفه به عنوان انجامشده)، پایش (نبض، فعالیت) و وضعیت (شارژ باتری، اعلانات).
توسعهدهنده Today Widget دو رویکرد دارد: WidgetKit مدرن (iOS 14+) و افزونه قدیمی NCWidgetProviding (iOS 8–13). انتخاب به حداقل نسخه iOS پشتیبانیشده بستگی دارد. WidgetKit برای پروژههای جدید توصیه میشود، NCWidgetProviding — برای پشتیبانی از دستگاههای قدیمی.
| ویژگی | WidgetKit | NCWidgetProviding |
|---|---|---|
| حداقل iOS | iOS 14 | iOS 8 |
| مکان | صفحه اصلی + «امروز» | فقط «امروز» |
| اندازهها | Small, Medium, Large | یک اندازه ثابت |
| تعامل | iOS 17+ دکمهها و کلیدها | فقط باز کردن برنامه |
| بهروزرسانی | Timeline Provider | widgetPerformUpdate |
| زبان | SwiftUI | UIKit |
اگر برنامه شما از iOS 14 و بالاتر پشتیبانی میکند — از WidgetKit استفاده کنید. دارای قابلیتهای غنی: اندازههای متعدد، پیکربندی از طریق intent، بازطراحی با iOS 17 و لینکهای عمیق. اعلامی بودن SwiftUI کد ویجت را جمعوجور و خوانا میکند. Timeline Provider به طور خودکار برنامه بهروزرسانی را با در نظر گرفتن مصرف انرژی مدیریت میکند.
فقط در صورت نیاز به پشتیبانی از iOS 9–13. NCWidgetProviding در پیادهسازی سادهتر است — یک UIViewController معمولی با پروتکل. اما محدود است: یک اندازه، فقط UIKit، بدون پیکربندی. Apple حتی برای پروژههای قدیمی توصیه میکند با استفاده از availability check به WidgetKit مهاجرت کنید: WidgetKit برای iOS 14+، NCWidgetProviding به عنوان fallback.
در iOS مدرن، سه نوع ویجت بر اساس هدف عملکردی متمایز میشوند. هر نوع مسئله خود را حل میکند و به رویکرد متفاوتی برای طراحی دادهها و رابط نیاز دارد. طبقهبندی به انتخاب معماری مناسب برای برنامه شما کمک میکند.
اطلاعات ایستا یا دورهای را نمایش میدهند: آبوهوا، تاریخ، نرخ ارز، وضعیت سرور. دادهها طبق برنامه از طریق Timeline Provider بهروزرسانی میشوند. کاربر با ویجت تعامل ندارد — فقط میخواند. ویجتهای اطلاعاتی — سادهترین در پیادهسازی، نیاز به پردازش رویدادهای لمسی ندارند و در پسزمینه بدون مجوزهای اضافی کار میکنند.
از iOS 17، WidgetKit از دکمهها، کلیدها و لغزندهها در ویجتها پشتیبانی میکند. کاربر میتواند بدون باز کردن برنامه عملی انجام دهد — علامتگذاری وظیفه، توقف موسیقی، روشن کردن چراغ. Interactive Widgets از App Intents برای انتقال اقدام به برنامه اصلی استفاده میکنند. محدودیت: فقط روی صفحه اصلی، نه در بخش «امروز» تا iOS 18.
کاربر دادههای نمایش داده شده را از طریق رابط سیستم شخصیسازی میکند — شهر را برای آبوهوا، حساب را برای امور مالی، دسته را برای اخبار انتخاب میکند. از طریق Intents Extension و پیکربندی در WidgetBundle پیادهسازی میشود. ویجتهای قابل پیکربندی شخصیسازی و مرتبط بودن اطلاعات را برای هر کاربر افزایش میدهند.
فرآیند ایجاد Today Widget در SwiftUI با استفاده از WidgetKit را بررسی میکنیم. ویجت نرخ ارز فعلی را با بهروزرسانی خودکار نمایش میدهد. WidgetKit به سه مؤلفه نیاز دارد: ساختار ویجت، Provider با پیکربندی و View برای نمایش.
import WidgetKit
import SwiftUI
@main
struct CurrencyWidget: Widget {
let kind: String = "CurrencyWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
CurrencyWidgetEntryView(entry: entry)
}
.configurationDisplayName("Currency Rate")
.description("Current USD/RUB exchange rate")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
Provider مسئول آمادهسازی دادهها برای نمایش است. متد getTimeline برنامه بهروزرسانی را ایجاد میکند: بهروزرسانی بعدی در 15 دقیقه. TimelineProvider تضمین میکند که ویجت بدون پرسوجوی مداوم از سرور، دادههای بهروز را نشان میدهد.
struct Provider: TimelineProvider {
func getSnapshot(in context: Context,
completion: @escaping (CurrencyEntry) -> Void) {
let entry = CurrencyEntry(date: Date(), rate: 92.5)
completion(entry)
}
func getTimeline(in context: Context,
completion: @escaping (Timeline<CurrencyEntry>) -> Void) {
let rate = CurrencyService().fetchRate()
let entry = CurrencyEntry(date: Date(), rate: rate)
let nextUpdate = Calendar.current.date(
byAdding: .minute, value: 15, to: Date()
) ?? Date()
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline)
}
}
Timeline Provider — مکانیزم مرکزی WidgetKit برای مدیریت دادههای Today Widget. به جای بهروزرسانی دورهای با تایمر (مانند NCWidgetProviding قدیمی)، WidgetKit از مفهوم timeline — دنبالهای از ورودیها با برچسبهای زمانی استفاده میکند. سیستم ورودی فعلی را تا انقضای آن نمایش میدهد، سپس به ورودی بعدی سوئیچ میکند یا ورودی جدیدی درخواست میکند.
Timeline از سه سیاست پشتیبانی میکند: .after(date) — بهروزرسانی بعدی در تاریخ مشخص؛ .never — ویجت تا فراخوانی صریح WidgetCenter.reloadAllTimelines بهروزرسانی نمیشود؛ .atEnd — بهروزرسانی پس از نمایش آخرین ورودی. برای Today Widget با نرخ ارز، سیاست .after با فاصله 15–30 دقیقه بهینه است. بهرهوری انرژی — مزیت کلیدی WidgetKit: سیستم بهروزرسانیهای همه ویجتها را در یک پنجره گروهبندی میکند.
اگر دادهها قبل از انقضای timeline تغییر کردهاند (مثلاً کاربر نرخ را در برنامه بهروز کرده)، WidgetCenter.shared.reloadTimelines(ofKind: "CurrencyWidget") را فراخوانی کنید. این یک timeline جدید از Provider درخواست کرده و نمایش را بهروز میکند. WidgetCenter همچنین امکان بارگذاری مجدد همه ویجتهای برنامه با یک دستور را فراهم میکند — پس از همگامسازی دادهها مفید است.
Apple الزامات سختگیرانهای برای طراحی Today Widget دارد: محتوا باید از فاصله قابل خواندن باشد، بدون عناصر اضافی و با سلسلهمراتب واضح. نقض توصیههای HIG (Human Interface Guidelines) دلیل رد هنگام انتشار در App Store است. سه اصل: glanceability، consistency و hierarchy.
کاربر کمتر از یک ثانیه روی ویجت وقت میگذارد. بیش از 3–4 عنصر داده اضافه نکنید. فونت — حداقل 11pt برای برچسبها، 17pt برای مقادیر. از پررنگ (Semibold) برای اعداد کلیدی استفاده کنید. از اسکرول خودداری کنید — Today Widget اسکرول نمیشود.
WidgetKit سه اندازه را پشتیبانی میکند: Small (170×170pt)، Medium (364×170pt)، Large (364×382pt). برای Today Widget در بخش «امروز» Medium رایجترین انتخاب است. طراحی تطبیقی از طریق EnvironmentValues: تراکم اطلاعات را بسته به اندازه تغییر دهید. Small — یک عدد، Medium — عدد + نمودار، Large — جدول.
ویجت باید بدون اقدامات اضافی توسعهدهنده در تم روشن و تاریک به درستی نمایش داده شود — WidgetKit به طور خودکار رنگهای سیستم را دریافت میکند. Dynamic Type برای ویجتها محدود است: اندازه فونت ثابت است اما باید خوانا باشد. UIColor.label و UIColor.systemBackground — رنگهای پایه برای متن و پسزمینه در هر دو تم.
سؤالات متداول
امروزه این همان ویجت WidgetKit است. تفاوت فقط در مکان است: روی صفحه اصلی و در بخش «امروز» (سمت چپ صفحه اول). تا iOS 14، Today Widget یک افزونه جداگانه NCWidgetProviding بود که فقط در مرکز اعلانات کار میکرد. اکنون این یک WidgetKit واحد است.
WidgetKit ویجتها را با تایمر بهروزرسانی نمیکند. توسعهدهنده برنامه را از طریق Timeline Provider تنظیم میکند: ورودیهایی با برچسبهای زمانی. سیستم بهروزرسانی را در زمان مشخص با در نظر گرفتن صرفهجویی در انرژی تضمین میکند — ممکن است چند دقیقه تأخیر داشته باشد. حداقل فاصله — 15 دقیقه، اما Apple توصیه میکند بیش از 1 بار در ساعت نباشد.
بله، از iOS 17 WidgetKit از دکمهها، کلیدها و لغزندهها از طریق App Intents پشتیبانی میکند. عناصر تعاملی روی صفحه اصلی iPhone و iPad کار میکنند. در بخش «امروز» پشتیبانی در iOS 18 ظاهر شد. برای iOS 16 و قدیمیتر — فقط باز کردن برنامه با کلیک روی ویجت.
محدودیتی وجود ندارد. برنامه میتواند هر تعداد ویجت را از طریق WidgetBundle ثبت کند — هر کدام با نوع، اندازه و پیکربندی خود. کاربر آنها را جداگانه اضافه میکند. توصیه میشود بیش از 3–5 ویجت نباشد تا انتخاب کاربر بیش از حد بارگذاری نشود.
WidgetKit به طور کامل در iOS Simulator پشتیبانی میشود. طرح target WidgetKit را در Xcode اجرا کنید — ویجت روی صفحه اصلی شبیهساز ظاهر میشود. برای بررسی Timeline Provider از WidgetKit Debug Profile استفاده کنید: Xcode → Product → Profile → WidgetKit Debug. رفتار واقعی را روی دستگاه فیزیکی بررسی کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.