Extensiile de aplicații sunt module executabile separate care extind capacitățile unei aplicații mobile dincolo de interfața sa principală: Today Widget pe ecranul de pornire, gestionarea apelurilor VoIP prin CallKit și reacția la evenimente de sistem prin BroadcastReceiver. Integrările de sistem permit unei aplicații să interacționeze cu sistemul de operare la un nivel profund, deblocând funcții indisponibile pentru ecranele obișnuite. Conform Documentației pentru Dezvoltatori Apple, fiecare extensie rulează într-un proces izolat și este gestionată de sistem independent de aplicația principală. Extensiile de aplicații într-o aplicație mobilă permit implementarea de funcții indisponibile în procesul principal.
Puncte cheie
Extensiile de aplicații pe iOS au apărut în iOS 8 și au devenit fundamentul integrărilor de sistem în dezvoltarea mobilă. Acestea sunt binare separate împachetate împreună cu aplicația principală, dar lansate într-un proces izolat. Fiecare extensie are propriul Info.plist și punct de intrare definit prin NSExtensionPrincipalClass. Sistemul gestionează ciclul de viață al extensiilor de aplicații — acestea nu pot rămâne în fundal după finalizarea unei sarcini.
WidgetKit (iOS 14+) este un framework modern pentru crearea widgeturilor pe ecranul de pornire. WidgetKit folosește SwiftUI pentru descrierea interfeței și TimelineProvider pentru definirea programelor de actualizare. Widgeturile vin în trei dimensiuni: mic (2×2 celule), mediu (4×2) și mare (4×4). Vechiul Today Widget bazat pe UICollectionViewController este încă suportat, dar Apple recomandă migrarea la WidgetKit. Extensiile de aplicații pe WidgetKit nu suportă animații, introducere de la tastatură sau gesturi — sunt elemente statice sau pseudo-animate cu actualizări periodice.
Share Extension permite trimiterea de conținut din orice aplicație către a ta prin foaia de partajare a sistemului. Share Extension primește date prin NSExtensionItem și folosește SLComposeServiceViewController pentru interfață. Action Extension procesează conținutul la fața locului — de exemplu, traduce text în browser fără a trece la o altă aplicație. Ambele tipuri trebuie să finalizeze munca într-un timp limitat, altfel sistemul „omoară" extensia. Aceasta este o limitare importantă a extensiilor de aplicații într-o aplicație mobilă — sarcinile de fundal nu sunt disponibile la nivel de extensie.
Integrările de sistem pe iOS depășesc cu mult widgeturile: CallKit, PushKit și SiriKit permit unei aplicații mobile să funcționeze la nivel de sistem. Aceste frameworkuri necesită entitlementuri speciale, dar oferă utilizatorului o experiență seamless — apelurile prin CallKit arată ca apelurile telefonice obișnuite, iar Siri procesează cererile fără a deschide aplicația.
CallKit integrează apelurile aplicațiilor terțe în ecranul de apeluri al sistemului, inclusiv ecranul blocat. CXProvider înregistrează aplicația ca serviciu VoIP, iar CXCallController gestionează apelurile. CallKit blochează automat apelurile duplicate și suportă Call Directory Extension pentru blocarea numerelor nedorite. Integrările de sistem în dezvoltarea mobilă cu CallKit sunt critice pentru aplicațiile de comunicare vocală — WhatsApp, Skype și Zoom îl folosesc pentru afișarea apelurilor primite.
PushKit livrează notificări push direct aplicației mobile fără a le afișa utilizatorului. PushKit trezește aplicația dintr-o stare „ucisă" și transmite date prin delegatul PKPushRegistryDelegate. Acesta este mecanismul principal pentru aplicațiile VoIP: PushKit livrează informațiile despre apel, iar CallKit le afișează. PushKit are o prioritate de livrare mai mare decât notificările push obișnuite și nu necesită afișarea unui banner. Extensiile de aplicații în aplicațiile mobile combină adesea PushKit cu CallKit pentru comunicarea vocală.
SiriKit permite procesarea cererilor prin Siri și aplicația Comenzi. Intents Extension este o extensie de aplicație separată care înregistrează intențiile suportate și le procesează. SiriKit suportă peste 20 de domenii: apeluri, mesaje, plăți, note, antrenamente. Comenzile rapide permit utilizatorului să creeze automatizări — de exemplu, „Trimite un mesaj în WhatsApp prin Siri". Integrările de sistem cu SiriKit și Comenzile rapide cresc implicarea, deoarece utilizatorul efectuează acțiuni fără a deschide aplicația.
BroadcastReceiver este o componentă Android care reacționează la mesajele de difuzare a sistemului. Spre deosebire de extensiile de aplicații iOS, BroadcastReceiver nu necesită un binar separat — este suficient să înregistrați receptorul în manifest sau în cod prin Context.registerReceiver. Integrările de sistem pe Android încep adesea cu BroadcastReceiver: de la pornirea unui serviciu la pornirea dispozitivului până la reacția la conexiunea de rețea.
IntentFilter leagă BroadcastReceiver de un eveniment de sistem specific. Evenimente tipice: BOOT_COMPLETED (pornirea dispozitivului), CONNECTIVITY_ACTION (schimbarea rețelei), BATTERY_LOW (baterie descărcată), TIME_SET (schimbarea orei). Receptorul este înregistrat în AndroidManifest.xml sau prin Context.registerReceiver pentru înregistrare dinamică. Înregistrarea dinamică este preferabilă — nu necesită permisiuni în manifest și funcționează doar când aplicația este activă. Extensiile de aplicații pe Android nu există ca concept, dar BroadcastReceiver îndeplinește un rol similar — extinde capacitățile aplicației prin integrări de sistem.
NotificationListenerService este un serviciu care primește toate notificările sistemului. NotificationListenerService necesită permisiunea BIND_NOTIFICATION_LISTENER_SERVICE și acces prin setările de accesibilitate. AccessibilityService este un instrument mai puternic pentru integrarea de sistem: poate citi conținutul ecranului, simula clicuri și automatiza acțiuni. Ambele servicii necesită activarea explicită de către utilizator în setări, ceea ce îmbunătățește securitatea. Integrările de sistem în aplicațiile mobile prin AccessibilityService sunt utilizate pentru auto-completare, cititoare de ecran și instrumente de accesibilitate.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
Exemplul înregistrează un BroadcastReceiver pentru evenimentul BOOT_COMPLETED. WorkManager este utilizat pentru executarea amânată a sarcinilor după pornirea dispozitivului — aceasta este abordarea standard pentru aplicațiile Android.
App Widget Provider pe Android este echivalentul extensiilor de aplicații iOS în contextul widgeturilor: este o componentă care afișează conținut interactiv pe ecranul de pornire. Spre deosebire de WidgetKit, widgeturile Android pot accepta intrarea utilizatorului — clicuri, comutatoare și gesturi. App Widget Provider este înregistrat în manifest printr-o descriere XML a dimensiunii și frecvenței de actualizare.
RemoteViews descrie interfața widgetului printr-un aspect XML și suportă doar un set limitat de vizualizări. RemoteViews nu permite vizualizări personalizate — doar componente standard: TextView, ImageView, Button, ProgressBar. AppWidgetProvider este clasa de bază care gestionează actualizările, activarea și ștergerea widgetului. Metoda onUpdate este apelată prin temporizator via updatePeriodMillis sau prin WorkManager pentru un control precis. Integrările de sistem cu widgeturile pe Android necesită prudență — actualizările prea frecvente consumă bateria.
Glance API este o bibliotecă Jetpack pentru crearea widgeturilor folosind Kotlin DSL în loc de XML. Glance API se compilează în RemoteViews și suportă o sintaxă asemănătoare cu Compose: GlanceComposable, Column, Row, Text. Biblioteca rezolvă problema codului XML complex și permite testarea widgeturilor prin JUnit. Glance API nu suportă încă toate funcționalitățile RemoteViews — pentru widgeturi interactive complexe, abordarea clasică este mai bună. Extensiile de aplicații în dezvoltarea mobilă pe Android evoluează către Glance API, simplificând crearea și întreținerea widgeturilor.
Content Provider este o componentă Android pentru partajarea datelor structurate între aplicații printr-o interfață unificată ContentResolver. Spre deosebire de extensiile de aplicații iOS, Content Provider nu creează un proces separat — datele sunt solicitate sincron în contextul aplicației apelante. Content Provider stă la baza integrărilor de sistem pe Android: contactele, fișierele media, calendarul și aplicațiile standard îl folosesc pentru publicarea datelor.
FileProvider este o subclasă a ContentProvider pentru transferul securizat de fișiere între aplicații. FileProvider generează URI-uri temporare content:// în loc de căi directe file://, care sunt interzise pe Android 7+. Pentru utilizare, trebuie să specificați files-path sau external-files-path în configurația XML. Extensiile de aplicații în dezvoltarea mobilă pe Android nu există ca un concept separat, dar FileProvider îndeplinește funcția lor — extinde capacitățile de partajare a datelor dincolo de o singură aplicație.
Pe iOS, rolul partajării de fișiere este îndeplinit de File Provider Extension. File Provider Extension publică fișierele aplicației în aplicația Fișiere prin NSFileProviderManager. Spre deosebire de FileProvider, extensia iOS necesită un binar separat și rulează într-un proces izolat. File Provider Extension suportă NSFileProviderItem pentru descrierea fișierelor și NSFileProviderEnumerator pentru navigarea prin dosare. Integrările de sistem în aplicațiile mobile prin File Provider Extension permit utilizatorului să gestioneze fișierele aplicației din aplicația Fișiere fără a o deschide.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
Exemplul arată o implementare minimă a File Provider Extension în Swift. Metoda item(for:) returnează un obiect NSFileProviderItem după identificator — sistemul o apelează când afișează fișiere în aplicația Fișiere.
Întrebări frecvente
Extensiile de aplicații sunt binare separate care extind funcționalitatea aplicației dincolo de procesul său: Today Widget, Share Extension, Action Extension, Keyboard Extension și alte tipuri care rulează într-un mediu izolat.
CallKit integrează apelurile VoIP în interfața de apeluri a sistemului cu afișare pe ecranul blocat. PushKit livrează notificări push în fundal fără a le afișa utilizatorului — trezește aplicația pentru a procesa date, cum ar fi informațiile despre un apel primit.
BroadcastReceiver este o componentă Android care reacționează la mesajele de difuzare a sistemului: pornirea dispozitivului (BOOT_COMPLETED), conexiunea la rețea (CONNECTIVITY_ACTION), schimbările modului avion și alte evenimente ale sistemului de operare.
Utilizați AppWidgetProvider cu RemoteViews pentru crearea interfeței widgetului sau Glance API (Jetpack) pentru abordarea Kotlin DSL. Widgetul este înregistrat în manifest printr-o descriere XML care specifică dimensiunea și frecvența de actualizare.
Content Provider este o componentă Android pentru partajarea datelor între aplicații prin ContentResolver. Este utilizat pentru a accesa contacte, fișiere media și orice date structurate din alte aplicații.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.