WidgetKit — Apple freymvorki, iOS 14 da taqdim etilgan bo'lib, dasturchilarga iPhone va iPad-ning asosiy ekranida, Mac ish stolida va Apple Watch siferblatida dinamik vidjetlarni joylashtirish imkonini beradi. Vidjetlar ilovani ochmasdan muhim ma'lumotlarni ko'rsatadi — ob-havo prognozi, valyuta kursi, taqvim, qadamlar. Apple Developer Documentation, 2026 ma'lumotlariga ko'ra, WidgetKit Apple ekotizimida kuniga 2 milliardgacha vidjet yangilanishlarini qayta ishlaydi va bu uni tizim ekranlarida ma'lumot ko'rsatish uchun eng ko'p ishlatiladigan freymvorklardan biriga aylantiradi.
Asosiy
WidgetKit — Apple qurilmalarining tizim ekranlarida mazmun ko'rsatadigan vidjetlar yaratish uchun Apple freymvorki. Vidjet — foydalanuvchi „silkish“ rejimida (jiggle mode) asosiy ekranda joylashtiradigan ilovangizning miniatyura ko'rinishidir. WidgetKit dan oldin mavjud bo'lgan watchOS komplikatsiyalaridan farqli o'laroq, yangi freymvork SwiftUI orqali yagona API yordamida barcha Apple platformalari uchun vidjet yaratishni birlashtirdi.
WidgetKit ning ishlash printsipi TimelineProvider ga asoslanadi — har bir yozuv ma'lum bir vaqtda vidjetning aniq holatini (Snapshot) o'z ichiga olgan tartiblangan TimelineEntry massivini yaratadigan ob'ekt. Tizim yozuvlarni ketma-ket ko'rsatadi va vaqt chizig'idagi keyingi yozuvga o'tishda vidjetni yangilaydi. Yozuvlar orasida WidgetKit ilova kodini chaqirmaydi — protsessor vaqti faqat yangi Timeline yaratilganda sarflanadi.
WWDC 2024 Session „WidgetKit: What's new” ma'lumotlariga ko'ra, o'rtacha iOS foydalanuvchisi asosiy ekranda 8–12 ta vidjetga ega va eng mashhur kategoriyalar ob-havo, vaqt, taqvim, fitness va moliyadir. WidgetKit yangilanishlar jadval bo'yicha amalga oshirilgani va real vaqtda emasligi sababli odatdagi foydalanishda kuniga batareyaning 1% dan kamini iste'mol qiladi.
iOS 14 dan oldin vidjetlar faqat Today View ko'rinishida mavjud edi — birinchi ekrandan chapga surish orqali kirish mumkin bo'lgan panel. Today Extension jiddiy cheklovlarga ega edi: ular faqat „Bugun“ ekranida mavjud edi, mazmunni yangilash uchun ilovani ochishni talab qilardi va o'lchamlarni cheklangan qo'llab-quvvatlardi. WidgetKit Today Extension ni to'liq almashtirib, asosiy ekranda, blok ekranida (iOS 16+) va Mac ish stolida vidjetlarni taqdim etdi.
WidgetKit arxitekturasi uchta asosiy protokolga asoslanadi: TimelineProvider, TimelineEntry va Widget. TimelineEntry — ma'lum bir vaqtda vidjet holatini ifodalovchi ma'lumot modeli. TimelineProvider har biri uchun faollashtirish sanasini ko'rsatgan holda bunday yozuvlar massivini (Timeline) yaratadi. Widget — provayderni SwiftUI ko'rinishi bilan bog'laydigan kirish nuqtasi.
getTimeline metodi tizim tomonidan vidjet birinchi marta qo'shilganda va keyin davriy ravishda — odatda provayder turiga qarab har 1–6 soatda chaqiriladi. Timeline soatlar yoki kunlar oldin uchun yozuvlarni o'z ichiga olishi mumkin, bu esa vidjetga yangilanishlar orasida ilova kodini chaqirmasdan ishlash imkonini beradi. Agar vidjetni zudlik bilan yangilash kerak bo'lsa (masalan, valyuta kursi o'zgardi), ilova WidgetCenter.shared.reloadAllTimelines() ni chaqirishi mumkin.
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 har biri qat'iy nisbatlarga ega bo'lgan uchta vidjet o'lchamini qo'llab-quvvatlaydi. Small (iPhone da 170×170 pt) ixcham ma'lumotni ko'rsatadi — bitta qiymat, belgi yoki qisqa matn. Medium (364×170 pt) small dan ikki barobar kengroq va bir nechta qiymat yoki mini-grafikni ko'rsatish uchun mos keladi. Large (364×382 pt) vertikal bo'yicha ekranning deyarli yarmini egallaydi va jadvallar, ro'yxatlar yoki kengaytirilgan ma'lumotlarni ko'rsatish imkonini beradi.
Dasturchi kamida ikkita o'lchamni qo'llab-quvvatlashi kerak — Apple small + medium ni tavsiya qiladi. Large vidjet faqat ilova bunday hajmni to'ldirish uchun yetarli mazmunga ega bo'lsa talab qilinadi. Har bir o'lcham o'zining SwiftUI ko'rinishini oladi, WidgetKit uni tizim ekranida renderlaydi. WidgetKit maxsus o'lchamlarni qo'llab-quvvatlamasligi muhim — faqat uchta qat'iy o'lcham, bu interfeysning bir xilligini kafolatlaydi.
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 ikki turdagi konfiguratsiyani taklif qiladi — StaticConfiguration va IntentConfiguration. StaticConfiguration barcha foydalanuvchilar uchun bir xil mazmunni ko'rsatadigan vidjetlar uchun mos keladi: valyuta kurslari, ob-havo, taqvim. IntentConfiguration foydalanuvchiga Siri intent tizimi orqali vidjet qo'shishda uni sozlash imkonini beradi „ masalan, ob-havo uchun ma'lum shaharni yoki aksiya kursi uchun ma'lum tickerni tanlash.
IntentConfiguration INWidgetIntent dan foydalanadi — SiriKit dan INIntent ning pastki sinfi. Foydalanuvchi vidjet qo'shib parametrlarni tanlaganda (masalan, shahar), tizim bu intentni saqlaydi va har bir yangilanishda TimelineProvider ga uzatadi. Provayder intentni getTimeline metodida oladi va mazmun yaratish uchun uning parametrlaridan foydalanadi. IntentConfiguration shaxsiylashtirilgan vidjetlar uchun afzal qilingan usuldir, chunki u Siri va Shortcuts bilan integratsiyalanadi.
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)
}
}
}
Vidjet yaratish Xcode da Widget Extension Target qo'shish bilan boshlanadi: File → New → Target → Widget Extension. Xcode avtomatik ravishda TimelineEntry, TimelineProvider va WidgetConfiguration bilan strukturani yaratadi. Dasturchiga faqat ma'lumotlarni ko'rsatish uchun SwiftUI ko'rinishini amalga oshirish va to'g'ri yangilanish jadvali uchun provayderni sozlash qoladi.
Quyida — bitcoinning joriy kursini ko'rsatish uchun oddiy vidjetning to'liq misoli: Provider URLSession orqali kursni yuklaydi va har soat yangilanadigan Timeline yaratadi. WidgetSwiftUIView kursni katta shrift bilan va oxirgi yangilanish vaqtini kichik shrift bilan ko'rsatadi.
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 dan boshlab, WidgetKit Lock Screen — iPhone blok ekranini qo'llab-quvvatlaydi. Lock Screen vidjetlari ikki xil bo'ladi: inline (soat ostida bir qator matn) va rectangular (to'rtburchak maydon). Home Screen vidjetlaridan farqli o'laroq, Lock Screen vidjetlari tez-tez yangilanadi — tizim tetigi telefonni qulfdan chiqarmasdan dolzarb ma'lumotni ko'rsatish uchun ularni har 15–30 daqiqada yangilash imkonini beradi.
Lock Screen vidjetlari WidgetConfiguration orqali accessoryFamilies bilan alohida sozlashni talab qiladi: accessoryCircular, accessoryRectangular, accessoryInline. Bu oilalar o'lcham va mazmun bo'yicha qat'iy cheklovlarga ega — ular tasvirlar, animatsiya va maxsus shriftlarni qo'llab-quvvatlamaydi. Apple Lock Screen vidjetlari uchun faqat matnli ma'lumot va tizim SF Symbols belgilaridan foydalanishni tavsiya qiladi.
Vidjetlarni ishlab chiqishda WidgetKit cheklovlarini hisobga olish muhim. Vidjetlar faqat o'qish uchun ko'rinishlardir: ular teginish hodisalarini qayta ishlamaydi (ilovani ochadigan teginishdan tashqari). Vidjetlar animatsiya, video, klaviatura kiritish, aylantirish yoki interaktiv elementlarni qo'llab-quvvatlamaydi. Har bir vidjet ma'lum bir vaqtda ma'lumotlarning statik suratidir va interaktivlik qo'shish urinishi App Store da ilovaning rad etilishiga olib keladi.
Eng yaxshi amaliyotlar Widget Center dan majburiy yangilash uchun foydalanish, tezkor javob uchun TimelineProvider darajasida ma'lumotlarni keshlash va boshlang'ich holat uchun placeholder dan foydalanishni o'z ichiga oladi. Shuningdek, bir nechta o'lchamlarni qo'llab-quvvatlash muhim — foydalanuvchi vidjetning ham small, ham medium variantida mavjud bo'lishini kutadi. Noto'g'ri yoki eskirgan ma'lumotlarni ko'rsatishdan qat'iy saqlaning — foydalanuvchi vidjetdan noto'g'ri ma'lumotni uzoq vaqt eslab qoladi.
| Nima mumkin emas | Nima uchun |
|---|---|
| Animatsiya va video | Vidjetlar statik suratlar; animatsiya batareyani zaryadsizlantiradi |
| Interaktivlik | WidgetKit ilova havolasidan tashqari UI elementlarini qo'llab-quvvatlamaydi |
| Aylantirish | Aylantirishsiz sobit o'lcham |
| Klaviatura | Vidjetda matn kiritish mumkin emas |
| Jonli ma'lumotlar | Ma'lumotlar Timeline jadvali bo'yicha yangilanadi, real vaqtda emas |
| Maxsus o'lchamlar | Faqat small, medium, large, accessory* sobit |
Tez-tez so'raladigan savollar
Ha, WidgetKit platformalararo. Xuddi shu Widget Extension yagona SwiftUI kodi bilan iOS, iPadOS va macOS nishonlariga kiritilishi mumkin. Farqlar faqat qo'llab-quvvatlanadigan Family larda namoyon bo'ladi — Mac da accessoryRectangular mavjud emas.
Timeline jadvali bo'yicha. Dasturchi keyingi yangilanish qachon bo'lishini belgilaydi — bir daqiqa yoki bir kundan keyin. Tizim tez-tez ishlatiladigan vidjetlar uchun yangilanishlarni tezlashtirishi mumkin.
Yo'q, WidgetKit UIButton yoki har qanday interaktiv elementlarni qo'llab-quvvatlamaydi. Yagona harakat — ilovani deep link orqali ochadigan vidjetga tegishdir.
WidgetCenter.shared.reloadAllTimelines() yoki ma'lum vidjet uchun reloadTimelines(ofKind:) dan foydalaning. Ilovadan chaqirish darhol provayderdan yangi Timeline ni so'raydi.
Minimal — odatdagi foydalanishda kuniga 1% dan kam zaryad. WidgetKit fon yangilanishlarini cheklaydi va ilovani faol ushlab turmaydi. Asosiy xarajat — birinchi qo'shishda Timeline yaratish.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.