Proširenja aplikacija su posebni izvršni moduli koji proširuju mogućnosti mobilne aplikacije izvan njenog glavnog interfejsa: Today Widget na početnom ekranu, obrada VoIP poziva preko CallKit i reakcija na sistemske događaje preko BroadcastReceiver. Sistemske integracije omogućavaju aplikaciji da interaguje sa operativnim sistemom na dubokom nivou, otvarajući funkcije nedostupne običnim ekranima. Prema Apple Developer dokumentaciji, svako proširenje radi u izolovanom procesu i njime upravlja sistem nezavisno od glavne aplikacije. Proširenja aplikacija u mobilnoj aplikaciji omogućavaju implementaciju funkcija nedostupnih u glavnom procesu.
Glavne tačke
Proširenja aplikacija na iOS-u pojavila su se u iOS 8 i postala temelj sistemskih integracija u mobilnom razvoju. Ovo su posebni binarni fajlovi upakovani zajedno sa glavnom aplikacijom, ali pokrenuti u izolovanom procesu. Svako proširenje ima sopstveni Info.plist i ulaznu tačku definisanu kroz NSExtensionPrincipalClass. Sistem upravlja životnim ciklusom proširenja aplikacija — ona ne mogu ostati u pozadini nakon završetka zadatka.
WidgetKit (iOS 14+) je moderan okvir za kreiranje widgeta na početnom ekranu. WidgetKit koristi SwiftUI za opis interfejsa i TimelineProvider za definisanje rasporeda ažuriranja. Widgeti dolaze u tri veličine: mali (2×2 ćelije), srednji (4×2) i veliki (4×4). Stari Today Widget baziran na UICollectionViewController se još uvek podržava, ali Apple preporučuje migraciju na WidgetKit. Proširenja aplikacija na WidgetKit-u ne podržavaju animaciju, unos sa tastature ili gestove — to su statički ili pseudo-animirani elementi sa periodičnim ažuriranjem.
Share Extension omogućava slanje sadržaja iz bilo koje aplikacije u vašu putem sistemskog lista za deljenje. Share Extension prima podatke kroz NSExtensionItem i koristi SLComposeServiceViewController za interfejs. Action Extension obrađuje sadržaj na licu mesta — na primer, prevodi tekst u pregledaču bez prelaska u drugu aplikaciju. Oba tipa moraju završiti posao u ograničenom vremenu, inače sistem "ubija" proširenje. Ovo je važno ograničenje proširenja aplikacija u mobilnoj aplikaciji — pozadinski zadaci nisu dostupni na nivou proširenja.
Sistemske integracije na iOS-u prevazilaze widgete: CallKit, PushKit i SiriKit omogućavaju mobilnoj aplikaciji da radi na sistemskom nivou. Ovi okviri zahtevaju posebne dozvole, ali pružaju korisniku besprekorno iskustvo — pozivi preko CallKit-a izgledaju kao obični telefonski pozivi, a Siri obrađuje zahteve bez otvaranja aplikacije.
CallKit integriše pozive aplikacija trećih strana u sistemski ekran poziva, uključujući zaključani ekran. CXProvider registruje aplikaciju kao VoIP servis, a CXCallController upravlja pozivima. CallKit automatski blokira duple pozive i podržava Call Directory Extension za blokiranje neželjenih brojeva. Sistemske integracije u mobilnom razvoju sa CallKit-om su kritične za aplikacije glasovne komunikacije — WhatsApp, Skype i Zoom ga koriste za prikaz dolaznih poziva.
PushKit dostavlja push obaveštenja direktno mobilnoj aplikaciji bez prikazivanja korisniku. PushKit budi aplikaciju iz "ubijenog" stanja i prenosi podatke kroz delegata PKPushRegistryDelegate. Ovo je primarni mehanizam za VoIP aplikacije: PushKit dostavlja informacije o pozivu, a CallKit ih prikazuje. PushKit ima veći prioritet isporuke od običnih push obaveštenja i ne zahteva prikaz banera. Proširenja aplikacija u mobilnim aplikacijama često kombinuju PushKit sa CallKit-om za glasovnu komunikaciju.
SiriKit omogućava obradu zahteva putem Siri-ja i aplikacije Prečice. Intents Extension je posebno proširenje aplikacije koje registruje podržane namere i obrađuje ih. SiriKit podržava 20+ domena: pozive, poruke, plaćanja, beleške, treninge. Prečice omogućavaju korisniku da kreira automatizacije — na primer, "Pošalji poruku u WhatsApp-u preko Siri-ja." Sistemske integracije sa SiriKit-om i Prečicama povećavaju angažovanost jer korisnik obavlja radnje bez otvaranja aplikacije.
BroadcastReceiver je Android komponenta koja reaguje na sistemske broadcast poruke. Za razliku od iOS proširenja aplikacija, BroadcastReceiver ne zahteva poseban binarni fajl — dovoljno je registrovati prijemnik u manifestu ili u kodu kroz Context.registerReceiver. Sistemske integracije na Androidu često počinju sa BroadcastReceiver: od pokretanja servisa pri pokretanju uređaja do reakcije na mrežnu konekciju.
IntentFilter povezuje BroadcastReceiver sa određenim sistemskim događajem. Tipični događaji: BOOT_COMPLETED (pokretanje uređaja), CONNECTIVITY_ACTION (promena mreže), BATTERY_LOW (niska baterija), TIME_SET (promena vremena). Prijemnik se registruje u AndroidManifest.xml ili kroz Context.registerReceiver za dinamičku registraciju. Dinamička registracija je poželjnija — ne zahteva dozvole u manifestu i radi samo dok je aplikacija aktivna. Proširenja aplikacija na Androidu ne postoje kao koncept, ali BroadcastReceiver igra sličnu ulogu — proširuje mogućnosti aplikacije kroz sistemske integracije.
NotificationListenerService je servis koji prima sva sistemska obaveštenja. NotificationListenerService zahteva dozvolu BIND_NOTIFICATION_LISTENER_SERVICE i pristup kroz podešavanja pristupačnosti. AccessibilityService je moćniji alat za sistemsku integraciju: može čitati sadržaj ekrana, simulirati klikove i automatizovati radnje. Oba servisa zahtevaju eksplicitno uključivanje od strane korisnika u podešavanjima, što povećava sigurnost. Sistemske integracije u mobilnim aplikacijama putem AccessibilityService se koriste za auto-filere, čitače ekrana i alate za pristupačnost.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
Primer registruje BroadcastReceiver za događaj BOOT_COMPLETED. WorkManager se koristi za odloženo izvršavanje zadataka nakon pokretanja uređaja — ovo je standardni pristup za Android aplikacije.
App Widget Provider na Androidu je pandan iOS proširenjima aplikacija u kontekstu widgeta: to je komponenta koja prikazuje interaktivni sadržaj na početnom ekranu. Za razliku od WidgetKit-a, Android widgeti mogu prihvatiti unos korisnika — klikove, prekidače i gestove. App Widget Provider se registruje u manifestu kroz XML opis veličine i učestalosti ažuriranja.
RemoteViews opisuje interfejs widgeta kroz XML izgled i podržava samo ograničeni skup View-ova. RemoteViews ne dozvoljava prilagođene View-ove — samo standardne komponente: TextView, ImageView, Button, ProgressBar. AppWidgetProvider je osnovna klasa koja upravlja ažuriranjima, uključivanjem i brisanjem widgeta. Metoda onUpdate se poziva putem tajmera kroz updatePeriodMillis ili kroz WorkManager za preciznu kontrolu. Sistemske integracije sa widgetima na Androidu zahtevaju oprez — prečesto ažuriranje troši bateriju.
Glance API je Jetpack biblioteka za kreiranje widgeta koristeći Kotlin DSL umesto XML. Glance API se kompajlira u RemoteViews i podržava sintaksu sličnu Compose-u: GlanceComposable, Column, Row, Text. Biblioteka rešava problem složenog XML koda i omogućava testiranje widgeta putem JUnit. Glance API još uvek ne podržava sve RemoteViews funkcije — za složene interaktivne widgete bolji je klasični pristup. Proširenja aplikacija u mobilnom razvoju na Androidu evoluiraju ka Glance API-u, pojednostavljujući kreiranje i održavanje widgeta.
Content Provider je Android komponenta za deljenje strukturiranih podataka između aplikacija kroz jedinstveni ContentResolver interfejs. Za razliku od iOS proširenja aplikacija, Content Provider ne kreira poseban proces — podaci se zahtevaju sinhrono u kontekstu aplikacije koja poziva. Content Provider je temelj sistemskih integracija na Androidu: kontakti, medijske datoteke, kalendar i standardne aplikacije ga koriste za objavljivanje podataka.
FileProvider je podklasa ContentProvider za siguran prenos datoteka između aplikacija. FileProvider generiše privremene content:// URI umesto direktnih file:// putanja, koje su zabranjene na Androidu 7+. Za upotrebu je potrebno navesti files-path ili external-files-path u XML konfiguraciji. Proširenja aplikacija u mobilnom razvoju na Androidu ne postoje kao poseban koncept, ali FileProvider obavlja njihovu funkciju — proširuje mogućnosti deljenja podataka izvan jedne aplikacije.
Na iOS-u ulogu deljenja datoteka obavlja File Provider Extension. File Provider Extension objavljuje datoteke aplikacije u aplikaciji Datoteke putem NSFileProviderManager. Za razliku od FileProvider-a, iOS proširenje zahteva poseban binarni fajl i radi u izolovanom procesu. File Provider Extension podržava NSFileProviderItem za opis datoteka i NSFileProviderEnumerator za navigaciju kroz fascikle. Sistemske integracije u mobilnim aplikacijama putem File Provider Extension omogućavaju korisniku upravljanje datotekama aplikacije iz aplikacije Datoteke bez njenog otvaranja.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
Primer prikazuje minimalnu implementaciju File Provider Extension u Swift-u. Metod item(for:) vraća NSFileProviderItem objekat po identifikatoru — sistem ga poziva prilikom prikaza datoteka u aplikaciji Datoteke.
Često postavljana pitanja
Proširenja aplikacija su posebni binarni fajlovi koji proširuju funkcionalnost aplikacije izvan njenog procesa: Today Widget, Share Extension, Action Extension, Keyboard Extension i drugi tipovi koji rade u izolovanom okruženju.
CallKit integriše VoIP pozive u sistemski interfejs poziva sa prikazom na zaključanom ekranu. PushKit dostavlja pozadinska push obaveštenja bez prikazivanja korisniku — budi aplikaciju za obradu podataka, poput informacija o dolaznom pozivu.
BroadcastReceiver je Android komponenta koja reaguje na sistemske broadcast poruke: pokretanje uređaja (BOOT_COMPLETED), mrežna konekcija (CONNECTIVITY_ACTION), promene režima rada i drugi OS događaji.
Koristite AppWidgetProvider sa RemoteViews za kreiranje interfejsa widgeta ili Glance API (Jetpack) za Kotlin DSL pristup. Widget se registruje u manifestu kroz XML opis koji specificira veličinu i učestalost ažuriranja.
Content Provider je Android komponenta za deljenje podataka između aplikacija putem ContentResolver. Koristi se za pristup kontaktima, medijskim datotekama i bilo kojim strukturiranim podacima iz drugih aplikacija.
Sumiranje
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.