Today Widget to rozszerzenie iOS, które wyświetla interaktywne informacje bezpośrednio w Centrum powiadomień lub na ekranie „Dzisiaj”. Użytkownik widzi aktualne dane — pogodę, kurs walut, kalendarz — bez otwierania głównej aplikacji. Według danych Apple WWDC (2025), użycie WidgetKit wzrosło o 40% po wprowadzeniu interaktywnych widżetów w iOS 17. Today Widget rozwiązuje problem szybkiego dostępu do informacji: wystarczy spojrzeć na ekran — a użytkownik otrzymuje potrzebne dane bez nawigacji po aplikacji.
Najważniejsze
Today Widget (znany również jako widżet Centrum powiadomień) to element interfejsu iOS, który wyświetla skondensowane informacje z aplikacji bez jej uruchamiania. Użytkownik widzi widżet, przesuwając ekran w lewo na ekranie blokady lub na ekranie głównym. Widżet może pokazywać dynamiczne dane — kurs walut, najnowsze wiadomości, status zadań, stan urządzenia.
Historycznie Today Widget pojawił się w iOS 8 jako rozszerzenie Centrum powiadomień, zaimplementowane przez framework Notification Center. W iOS 14 Apple wprowadziło WidgetKit — całkowicie przeprojektowaną architekturę, która pozwala umieszczać widżety bezpośrednio na pulpicie. Today Widget we współczesnym rozumieniu to widżet WidgetKit umieszczony w sekcji „Dzisiaj” (sekcja widżetów na lewo od pierwszego ekranu).
Głównym celem jest skrócenie czasu dostępu do informacji. Zamiast otwierać aplikację, nawigować po menu i czekać na ładowanie, użytkownik od razu widzi potrzebne dane. Według Apple (2024), aplikacje z widżetami wykazują 27% wyższe zaangażowanie użytkowników. Dodatkowe scenariusze: szybkie akcje (oznaczenie zadania jako wykonane), monitorowanie (puls, aktywność) i status (poziom baterii, powiadomienia).
Deweloper Today Widget ma do wyboru dwa podejścia: nowoczesny WidgetKit (iOS 14+) i starsze rozszerzenie NCWidgetProviding (iOS 8–13). Wybór zależy od minimalnej wspieranej wersji iOS. WidgetKit jest zalecany dla nowych projektów, NCWidgetProviding — dla wsparcia starszych urządzeń.
| Cecha | WidgetKit | NCWidgetProviding |
|---|---|---|
| Minimalne iOS | iOS 14 | iOS 8 |
| Umiejscowienie | Pulpit + „Dzisiaj” | Tylko „Dzisiaj” |
| Rozmiary | Small, Medium, Large | Jeden stały |
| Interaktywność | iOS 17+ przyciski i przełączniki | Tylko otwieranie aplikacji |
| Aktualizacja | Timeline Provider | widgetPerformUpdate |
| Język | SwiftUI | UIKit |
Jeśli Twoja aplikacja obsługuje iOS 14 i nowsze — używaj WidgetKit. Oferuje bogate możliwości: wiele rozmiarów, konfigurację przez intent, przeprojektowanie z iOS 17 i głębokie linki. Deklaratywność SwiftUI sprawia, że kod widżetu jest kompaktowy i czytelny. Timeline Provider automatycznie zarządza harmonogramem aktualizacji z uwzględnieniem zużycia energii.
Tylko jeśli wymagane jest wsparcie iOS 9–13. NCWidgetProviding jest prostszy w implementacji — to zwykły UIViewController z protokołem. Jest jednak ograniczony: jeden rozmiar, tylko UIKit, brak konfiguracji. Apple zaleca przejście na WidgetKit nawet dla starych projektów, używając availability check: WidgetKit na iOS 14+, NCWidgetProviding jako fallback.
We współczesnym iOS wyróżnia się trzy typy widżetów według przeznaczenia funkcjonalnego. Każdy typ rozwiązuje swoje zadanie i wymaga innego podejścia do projektowania danych i interfejsu. Klasyfikacja pomaga wybrać odpowiednią architekturę dla Twojej aplikacji.
Wyświetlają statyczne lub okresowo aktualizowane informacje: pogodę, datę, kurs walut, status serwera. Dane są aktualizowane zgodnie z harmonogramem przez Timeline Provider. Użytkownik nie wchodzi w interakcję z widżetem — tylko czyta. Widżety informacyjne są najprostsze w implementacji, nie wymagają obsługi zdarzeń dotykowych i działają w tle bez dodatkowych uprawnień.
Od iOS 17 WidgetKit obsługuje przyciski, przełączniki i suwaki w widżetach. Użytkownik może wykonać akcję — oznaczyć zadanie, wstrzymać muzykę, włączyć światło — bez otwierania aplikacji. Interactive Widgets używają App Intents do przekazywania akcji do głównej aplikacji. Ograniczenie: tylko na pulpicie, nie w sekcji „Dzisiaj” do iOS 18.
Użytkownik dostosowuje wyświetlane dane przez interfejs systemowy — wybiera miasto dla pogody, konto dla finansów, kategorię dla wiadomości. Implementowane przez Intents Extension i konfigurację w WidgetBundle. Widżety konfigurowalne zwiększają personalizację i trafność informacji dla każdego użytkownika.
Rozważmy proces tworzenia Today Widget w SwiftUI z użyciem WidgetKit. Widżet będzie wyświetlał aktualny kurs waluty z automatyczną aktualizacją. WidgetKit wymaga trzech komponentów: struktury widżetu, Providera z konfiguracją i widoku do wyświetlania.
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 odpowiada za przygotowanie danych do wyświetlenia. Metoda getTimeline tworzy harmonogram aktualizacji: następna aktualizacja za 15 minut. TimelineProvider gwarantuje, że widżet pokazuje aktualne dane bez ciągłego odpytywania serwera.
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 to centralny mechanizm WidgetKit do zarządzania danymi Today Widget. Zamiast okresowej aktualizacji za pomocą timera (jak w starym NCWidgetProviding), WidgetKit używa koncepcji timeline — sekwencji wpisów z znacznikami czasu. System wyświetla bieżący wpis do jego wygaśnięcia, następnie przełącza się na następny lub żąda nowego.
Timeline obsługuje trzy polityki: .after(date) — następna aktualizacja w określonej dacie; .never — widżet nie jest aktualizowany do jawnego wywołania WidgetCenter.reloadAllTimelines; .atEnd — aktualizacja po wyświetleniu ostatniego wpisu. Dla Today Widget z kursem walut optymalna jest polityka .after z interwałem 15–30 minut. Efektywność energetyczna — kluczowa zaleta WidgetKit: system grupuje aktualizacje wszystkich widżetów w jednym oknie.
Jeśli dane zmieniły się przed wygaśnięciem timeline (np. użytkownik zaktualizował kurs w aplikacji), wywołaj WidgetCenter.shared.reloadTimelines(ofKind: "CurrencyWidget"). Spowoduje to żądanie nowego timeline od Providera i zaktualizuje wyświetlanie. WidgetCenter pozwala również przeładować wszystkie widżety aplikacji jedną komendą — wygodne po synchronizacji danych.
Apple stawia surowe wymagania dotyczące projektu Today Widget: treść musi być czytelna z dystansu, bez zbędnych elementów i z wyraźną hierarchią. Naruszenie zaleceń HIG (Human Interface Guidelines) to powód odrzucenia przy publikacji w App Store. Trzy zasady: glanceability, consistency i hierarchy.
Użytkownik spędza na widżecie mniej niż sekundę. Nie dodawaj więcej niż 3–4 elementów danych. Czcionka — minimum 11pt dla etykiet, 17pt dla wartości. Używaj pogrubienia (Semibold) dla kluczowych liczb. Unikaj przewijania — Today Widget nie przewija się.
WidgetKit obsługuje trzy rozmiary: Small (170×170pt), Medium (364×170pt), Large (364×382pt). Dla Today Widget w sekcji „Dzisiaj” Medium to najczęstszy wybór. Projekt adaptacyjny przez EnvironmentValues: zmieniaj gęstość informacji w zależności od rozmiaru. Small — jedna liczba, Medium — liczba + wykres, Large — tabela.
Widżet musi poprawnie wyświetlać się w jasnym i ciemnym motywie bez dodatkowych działań dewelopera — WidgetKit automatycznie przejmuje systemowe kolory. Dynamic Type dla widżetów jest ograniczony: rozmiar czcionki jest stały, ale musi być czytelny. UIColor.label i UIColor.systemBackground — podstawowe kolory dla tekstu i tła w obu motywach.
Często zadawane pytania
Obecnie to ten sam widżet WidgetKit. Różnica polega tylko na lokalizacji: na pulpicie i w sekcji „Dzisiaj” (na lewo od pierwszego ekranu). Do iOS 14 Today Widget był osobnym rozszerzeniem NCWidgetProviding, które działało tylko w Centrum powiadomień. Teraz to jeden WidgetKit.
WidgetKit nie aktualizuje widżetów za pomocą timera. Deweloper ustawia harmonogram przez Timeline Provider: wpisy z znacznikami czasu. System gwarantuje aktualizację w określonym czasie z uwzględnieniem oszczędzania energii — może opóźnić o kilka minut. Minimalny interwał — 15 minut, ale Apple zaleca nie częściej niż 1 raz na godzinę.
Tak, począwszy od iOS 17 WidgetKit obsługuje przyciski, przełączniki i suwaki przez App Intents. Elementy interaktywne działają na pulpicie iPhone i iPad. W sekcji „Dzisiaj” wsparcie pojawiło się w iOS 18. Dla iOS 16 i starszych — tylko otwieranie aplikacji po kliknięciu na widżet.
Nie ma ograniczeń. Aplikacja może zarejestrować dowolną liczbę widżetów przez WidgetBundle — każdy z własnym typem, rozmiarem i konfiguracją. Użytkownik dodaje je osobno. Zaleca się nie więcej niż 3–5 widżetów, aby nie przeciążać wyboru użytkownika.
WidgetKit jest w pełni obsługiwany w iOS Simulator. Uruchom schemat targetu WidgetKit w Xcode — widżet pojawi się na pulpicie symulatora. Do sprawdzenia Timeline Provider użyj WidgetKit Debug Profile: Xcode → Product → Profile → WidgetKit Debug. Rzeczywiste zachowanie sprawdzaj na fizycznym urządzeniu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również