Rozszerzenia aplikacji to osobne moduły wykonywalne, które rozszerzają możliwości aplikacji mobilnej poza jej główny interfejs: Today Widget na ekranie głównym, obsługa połączeń VoIP przez CallKit i reakcja na zdarzenia systemowe przez BroadcastReceiver. Integracje systemowe pozwalają aplikacji na interakcję z systemem operacyjnym na głębokim poziomie, odblokowując funkcje niedostępne dla zwykłych ekranów. Według dokumentacji Apple Developer, każde rozszerzenie działa w izolowanym procesie i jest zarządzane przez system niezależnie od głównej aplikacji. Rozszerzenia aplikacji w aplikacji mobilnej pozwalają zaimplementować funkcje niedostępne w głównym procesie.
Najważniejsze punkty
Rozszerzenia aplikacji na iOS pojawiły się w iOS 8 i stały się fundamentem integracji systemowych w rozwoju mobilnym. Są to osobne pliki binarne spakowane z główną aplikacją, ale uruchamiane w izolowanym procesie. Każde rozszerzenie ma własny Info.plist i punkt wejścia zdefiniowany przez NSExtensionPrincipalClass. System zarządza cyklem życia rozszerzeń aplikacji — nie mogą one pozostawać w tle po zakończeniu zadania.
WidgetKit (iOS 14+) to nowoczesny framework do tworzenia widgetów na ekranie głównym. WidgetKit używa SwiftUI do opisu interfejsu i TimelineProvider do definiowania harmonogramów aktualizacji. Widgety występują w trzech rozmiarach: mały (2×2 komórki), średni (4×2) i duży (4×4). Stary Today Widget oparty na UICollectionViewController jest nadal obsługiwany, ale Apple zaleca migrację do WidgetKit. Rozszerzenia aplikacji na WidgetKit nie obsługują animacji, wprowadzania z klawiatury ani gestów — są to statyczne lub pseudoanimowane elementy z okresowymi aktualizacjami.
Share Extension pozwala wysyłać treści z dowolnej aplikacji do twojej za pomocą systemowego arkusza udostępniania. Share Extension odbiera dane przez NSExtensionItem i używa SLComposeServiceViewController do interfejsu. Action Extension przetwarza treści na miejscu — na przykład tłumaczy tekst w przeglądarce bez przełączania się do innej aplikacji. Oba typy muszą zakończyć pracę w ograniczonym czasie, w przeciwnym razie system „zabija" rozszerzenie. To ważne ograniczenie rozszerzeń aplikacji w aplikacji mobilnej — zadania w tle nie są dostępne na poziomie rozszerzenia.
Integracje systemowe na iOS wykraczają daleko poza widgety: CallKit, PushKit i SiriKit pozwalają aplikacji mobilnej działać na poziomie systemu. Te frameworki wymagają specjalnych uprawnień, ale zapewniają użytkownikowi płynne doświadczenie — połączenia przez CallKit wyglądają jak zwykłe połączenia telefoniczne, a Siri przetwarza zapytania bez otwierania aplikacji.
CallKit integruje połączenia aplikacji zewnętrznych z systemowym ekranem połączeń, w tym zablokowanym ekranem. CXProvider rejestruje aplikację jako usługę VoIP, a CXCallController zarządza połączeniami. CallKit automatycznie blokuje duplikujące się połączenia i obsługuje Call Directory Extension do blokowania niechcianych numerów. Integracje systemowe w rozwoju mobilnym z CallKit są krytyczne dla aplikacji komunikacji głosowej — WhatsApp, Skype i Zoom używają go do wyświetlania przychodzących połączeń.
PushKit dostarcza powiadomienia push bezpośrednio do aplikacji mobilnej bez pokazywania ich użytkownikowi. PushKit wybudza aplikację ze stanu „zabitego" i przekazuje dane przez delegata PKPushRegistryDelegate. To podstawowy mechanizm dla aplikacji VoIP: PushKit dostarcza informacje o połączeniu, a CallKit je wyświetla. PushKit ma wyższy priorytet dostarczania niż zwykłe powiadomienia push i nie wymaga wyświetlania banera. Rozszerzenia aplikacji w aplikacjach mobilnych często łączą PushKit z CallKit do komunikacji głosowej.
SiriKit pozwala przetwarzać zapytania przez Siri i aplikację Skróty. Intents Extension to osobne rozszerzenie aplikacji, które rejestruje obsługiwane intencje i je przetwarza. SiriKit obsługuje ponad 20 domen: połączenia, wiadomości, płatności, notatki, treningi. Skróty pozwalają użytkownikowi tworzyć automatyzacje — na przykład „Wyślij wiadomość w WhatsApp przez Siri". Integracje systemowe z SiriKit i Skrótami zwiększają zaangażowanie, ponieważ użytkownik wykonuje czynności bez otwierania aplikacji.
BroadcastReceiver to komponent Androida, który reaguje na systemowe komunikaty rozgłoszeniowe. W przeciwieństwie do rozszerzeń aplikacji iOS, BroadcastReceiver nie wymaga osobnego pliku binarnego — wystarczy zarejestrować odbiornik w manifeście lub w kodzie przez Context.registerReceiver. Integracje systemowe na Androidzie często zaczynają się od BroadcastReceiver: od uruchomienia usługi przy starcie urządzenia do reakcji na połączenie sieciowe.
IntentFilter wiąże BroadcastReceiver z konkretnym zdarzeniem systemowym. Typowe zdarzenia: BOOT_COMPLETED (uruchomienie urządzenia), CONNECTIVITY_ACTION (zmiana sieci), BATTERY_LOW (niski poziom baterii), TIME_SET (zmiana czasu). Odbiornik jest rejestrowany w AndroidManifest.xml lub przez Context.registerReceiver do rejestracji dynamicznej. Rejestracja dynamiczna jest preferowana — nie wymaga uprawnień w manifeście i działa tylko podczas aktywności aplikacji. Rozszerzenia aplikacji na Androidzie nie istnieją jako koncepcja, ale BroadcastReceiver pełni podobną rolę — rozszerza możliwości aplikacji poprzez integracje systemowe.
NotificationListenerService to usługa, która odbiera wszystkie powiadomienia systemowe. NotificationListenerService wymaga uprawnienia BIND_NOTIFICATION_LISTENER_SERVICE i dostępu przez ustawienia dostępności. AccessibilityService to potężniejsze narzędzie do integracji systemowej: może czytać zawartość ekranu, symulować kliknięcia i automatyzować działania. Obie usługi wymagają wyraźnego włączenia przez użytkownika w ustawieniach, co zwiększa bezpieczeństwo. Integracje systemowe w aplikacjach mobilnych przez AccessibilityService są używane do autofillera, czytników ekranu i narzędzi dostępności.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
Przykład rejestruje BroadcastReceiver dla zdarzenia BOOT_COMPLETED. WorkManager jest używany do opóźnionego wykonywania zadań po uruchomieniu urządzenia — to standardowe podejście dla aplikacji Android.
App Widget Provider na Androidzie to odpowiednik rozszerzeń aplikacji iOS w kontekście widgetów: to komponent wyświetlający interaktywną treść na ekranie głównym. W przeciwieństwie do WidgetKit, widgety Androida mogą przyjmować dane wejściowe użytkownika — kliknięcia, przełączniki i gesty. App Widget Provider jest rejestrowany w manifeście poprzez opis XML rozmiaru i częstotliwości aktualizacji.
RemoteViews opisuje interfejs widgeta przez układ XML i obsługuje tylko ograniczony zestaw widoków. RemoteViews nie pozwala na niestandardowe widoki — tylko standardowe komponenty: TextView, ImageView, Button, ProgressBar. AppWidgetProvider to klasa bazowa, która obsługuje aktualizacje, włączanie i usuwanie widgeta. Metoda onUpdate jest wywoływana przez timer przez updatePeriodMillis lub przez WorkManager w celu precyzyjnej kontroli. Integracje systemowe z widgetami na Androidzie wymagają ostrożności — zbyt częste aktualizacje wyczerpują baterię.
Glance API to biblioteka Jetpack do tworzenia widgetów przy użyciu Kotlin DSL zamiast XML. Glance API kompiluje się do RemoteViews i obsługuje składnię podobną do Compose: GlanceComposable, Column, Row, Text. Biblioteka rozwiązuje problem złożonego kodu XML i umożliwia testowanie widgetów przez JUnit. Glance API nie obsługuje jeszcze wszystkich funkcji RemoteViews — dla złożonych interaktywnych widgetów lepsze jest klasyczne podejście. Rozszerzenia aplikacji w rozwoju mobilnym na Androidzie ewoluują w kierunku Glance API, upraszczając tworzenie i utrzymanie widgetów.
Content Provider to komponent Androida do udostępniania strukturyzowanych danych między aplikacjami przez ujednolicony interfejs ContentResolver. W przeciwieństwie do rozszerzeń aplikacji iOS, Content Provider nie tworzy osobnego procesu — dane są żądane synchronicznie w kontekście wywołującej aplikacji. Content Provider leży u podstaw integracji systemowych na Androidzie: kontakty, pliki multimedialne, kalendarz i standardowe aplikacje używają go do publikowania danych.
FileProvider to podklasa ContentProvider do bezpiecznego przesyłania plików między aplikacjami. FileProvider generuje tymczasowe URI content:// zamiast bezpośrednich ścieżek file://, które są zabronione na Androidzie 7+. Aby go użyć, należy określić files-path lub external-files-path w konfiguracji XML. Rozszerzenia aplikacji w rozwoju mobilnym na Androidzie nie istnieją jako osobna koncepcja, ale FileProvider pełni ich funkcję — rozszerza możliwości udostępniania danych poza jedną aplikację.
Na iOS rolę udostępniania plików pełni File Provider Extension. File Provider Extension publikuje pliki aplikacji w aplikacji Pliki przez NSFileProviderManager. W przeciwieństwie do FileProvider, rozszerzenie iOS wymaga osobnego pliku binarnego i działa w izolowanym procesie. File Provider Extension obsługuje NSFileProviderItem do opisu plików i NSFileProviderEnumerator do nawigacji po folderach. Integracje systemowe w aplikacjach mobilnych przez File Provider Extension pozwalają użytkownikowi zarządzać plikami aplikacji z aplikacji Pliki bez jej otwierania.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
Przykład pokazuje minimalną implementację File Provider Extension w Swift. Metoda item(for:) zwraca obiekt NSFileProviderItem po identyfikatorze — system wywołuje ją podczas wyświetlania plików w aplikacji Pliki.
Często zadawane pytania
Rozszerzenia aplikacji to osobne pliki binarne rozszerzające funkcjonalność aplikacji poza jej proces: Today Widget, Share Extension, Action Extension, Keyboard Extension i inne typy działające w izolowanym środowisku.
CallKit integruje połączenia VoIP z systemowym interfejsem połączeń z wyświetlaniem na zablokowanym ekranie. PushKit dostarcza push powiadomienia w tle bez pokazywania ich użytkownikowi — wybudza aplikację do przetwarzania danych, takich jak informacje o połączeniu przychodzącym.
BroadcastReceiver to komponent Androida reagujący na systemowe komunikaty rozgłoszeniowe: uruchomienie urządzenia (BOOT_COMPLETED), połączenie sieciowe (CONNECTIVITY_ACTION), zmiany trybu samolotowego i inne zdarzenia systemu operacyjnego.
Użyj AppWidgetProvider z RemoteViews do tworzenia interfejsu widgeta lub Glance API (Jetpack) do podejścia Kotlin DSL. Widget jest rejestrowany w manifeście poprzez opis XML określający rozmiar i częstotliwość aktualizacji.
Content Provider to komponent Androida do udostępniania danych między aplikacjami przez ContentResolver. Jest używany do dostępu do kontaktów, plików multimedialnych i wszelkich strukturyzowanych danych z innych aplikacji.
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.