App Extensions zijn aparte uitvoerbare modules die de mogelijkheden van een mobiele app uitbreiden buiten de hoofdinterface: Today Widget op het startscherm, VoIP-gespreksafhandeling via CallKit en reactie op systeemgebeurtenissen via BroadcastReceiver. Systeemintegraties stellen een app in staat om op een diep niveau met het besturingssysteem te interageren, waardoor functies worden ontgrendeld die niet beschikbaar zijn voor gewone schermen. Volgens de Apple Developer-documentatie draait elke extensie in een geïsoleerd proces en wordt beheerd door het systeem, onafhankelijk van de hoofd-app. App Extensions in een mobiele app maken het mogelijk functies te implementeren die niet beschikbaar zijn in het hoofdproces.
Belangrijkste punten
App Extensions op iOS verschenen in iOS 8 en werden de basis voor systeemintegraties in mobiele ontwikkeling. Dit zijn aparte binaire bestanden die samen met de hoofd-app worden gebundeld, maar worden gestart in een geïsoleerd proces. Elke extensie heeft zijn eigen Info.plist en een ingangspunt gedefinieerd via NSExtensionPrincipalClass. Het systeem beheert de levenscyclus van App Extensions — ze kunnen niet op de achtergrond blijven nadat een taak is voltooid.
WidgetKit (iOS 14+) is een modern framework voor het maken van widgets op het startscherm. WidgetKit gebruikt SwiftUI voor het beschrijven van de interface en TimelineProvider voor het definiëren van updateschema's. Widgets zijn er in drie maten: klein (2×2 cellen), medium (4×2) en groot (4×4). De oude Today Widget op basis van UICollectionViewController wordt nog steeds ondersteund, maar Apple raadt aan om te migreren naar WidgetKit. App Extensions op WidgetKit ondersteunen geen animatie, toetsenbordinvoer of gebaren — dit zijn statische of pseudo-geanimeerde elementen met periodieke updates.
Share Extension maakt het mogelijk om inhoud vanuit elke app naar jouw app te verzenden via het systeemdeelblad. Share Extension ontvangt gegevens via NSExtensionItem en gebruikt SLComposeServiceViewController voor de gebruikersinterface. Action Extension verwerkt inhoud ter plaatse — bijvoorbeeld tekst vertalen in de browser zonder naar een andere app te gaan. Beide typen moeten hun werk binnen een beperkte tijd voltooien, anders "doodt" het systeem de extensie. Dit is een belangrijke beperking van App Extensions in een mobiele app — achtergrondtaken zijn niet beschikbaar op extensieniveau.
De systeemintegraties op iOS gaan veel verder dan widgets: CallKit, PushKit en SiriKit stellen een mobiele app in staat om op systeemniveau te werken. Deze frameworks vereisen speciale rechten, maar bieden de gebruiker een naadloze ervaring — gesprekken via CallKit zien eruit als gewone telefoongesprekken en Siri verwerkt verzoeken zonder de app te openen.
CallKit integreert gesprekken van apps van derden in het systeemgespreksscherm, inclusief het vergrendelde scherm. CXProvider registreert de app als een VoIP-dienst en CXCallController beheert gesprekken. CallKit blokkeert automatisch dubbele gesprekken en ondersteunt Call Directory Extension voor het blokkeren van ongewenste nummers. Systeemintegraties in mobiele ontwikkeling met CallKit zijn cruciaal voor spraakcommunicatie-apps — WhatsApp, Skype en Zoom gebruiken het om inkomende gesprekken weer te geven.
PushKit levert pushmeldingen rechtstreeks aan de mobiele app zonder ze aan de gebruiker te tonen. PushKit wekt de app uit een "gedode" toestand en geeft gegevens door via de gedelegeerde PKPushRegistryDelegate. Dit is het primaire mechanisme voor VoIP-apps: PushKit levert gespreksinformatie en CallKit toont deze. PushKit heeft een hogere bezorgprioriteit dan gewone pushmeldingen en vereist geen weergave van een banner. App Extensions in mobiele apps combineren vaak PushKit met CallKit voor spraakcommunicatie.
SiriKit maakt het mogelijk om verzoeken via Siri en de Snelkoppelingen-app te verwerken. Intents Extension is een aparte App Extension die ondersteunde intenties registreert en verwerkt. SiriKit ondersteunt meer dan 20 domeinen: gesprekken, berichten, betalingen, notities, trainingen. Snelkoppelingen stellen de gebruiker in staat om automatiseringen te maken — bijvoorbeeld "Een bericht in WhatsApp verzenden via Siri." Systeemintegraties met SiriKit en Snelkoppelingen verhogen de betrokkenheid omdat de gebruiker acties uitvoert zonder de app te openen.
BroadcastReceiver is een Android-component die reageert op systeembroadcastberichten. In tegenstelling tot iOS App Extensions heeft BroadcastReceiver geen apart binair bestand nodig — het volstaat om de ontvanger te registreren in het manifest of in code via Context.registerReceiver. Systeemintegraties op Android beginnen vaak met BroadcastReceiver: van het starten van een dienst bij het opstarten van het apparaat tot het reageren op netwerkverbinding.
IntentFilter bindt BroadcastReceiver aan een specifieke systeemgebeurtenis. Typische gebeurtenissen: BOOT_COMPLETED (opstarten apparaat), CONNECTIVITY_ACTION (netwerkverandering), BATTERY_LOW (lage batterij), TIME_SET (tijdwijziging). De ontvanger wordt geregistreerd in AndroidManifest.xml of via Context.registerReceiver voor dynamische registratie. Dynamische registratie heeft de voorkeur — het vereist geen machtigingen in het manifest en werkt alleen terwijl de app actief is. App Extensions op Android bestaan niet als concept, maar BroadcastReceiver vervult een vergelijkbare rol — het breidt de app-mogelijkheden uit via systeemintegraties.
NotificationListenerService is een dienst die alle systeemmeldingen ontvangt. NotificationListenerService vereist de machtiging BIND_NOTIFICATION_LISTENER_SERVICE en toegang via de toegankelijkheidsinstellingen. AccessibilityService is een krachtiger hulpmiddel voor systeemintegratie: het kan scherminhoud lezen, klikken simuleren en acties automatiseren. Beide diensten vereisen expliciete inschakeling door de gebruiker in de instellingen, wat de beveiliging verhoogt. Systeemintegraties in mobiele apps via AccessibilityService worden gebruikt voor automatische invullers, schermlezers en toegankelijkheidshulpmiddelen.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
Het voorbeeld registreert een BroadcastReceiver voor de gebeurtenis BOOT_COMPLETED. WorkManager wordt gebruikt voor het uitgesteld uitvoeren van taken na het opstarten van het apparaat — dit is de standaardaanpak voor Android-apps.
App Widget Provider op Android is het equivalent van iOS App Extensions in de context van widgets: het is een component die interactieve inhoud op het startscherm weergeeft. In tegenstelling tot WidgetKit kunnen Android-widgets gebruikersinvoer accepteren — klikken, schakelaars en gebaren. App Widget Provider wordt geregistreerd in het manifest via een XML-beschrijving van grootte en updatefrequentie.
RemoteViews beschrijft de widgetinterface via een XML-lay-out en ondersteunt slechts een beperkte set Views. RemoteViews staat geen aangepaste Views toe — alleen standaardcomponenten: TextView, ImageView, Button, ProgressBar. AppWidgetProvider is de basisklasse die widgetupdates, inschakeling en verwijdering afhandelt. De methode onUpdate wordt aangeroepen via een timer via updatePeriodMillis of via WorkManager voor nauwkeurige controle. Systeemintegraties met widgets op Android vereisen voorzichtigheid — te frequente updates verbruiken de batterij.
Glance API is een Jetpack-bibliotheek voor het maken van widgets met Kotlin DSL in plaats van XML. Glance API compileert naar RemoteViews en ondersteunt een Compose-achtige syntaxis: GlanceComposable, Column, Row, Text. De bibliotheek lost het probleem van complexe XML-code op en maakt het testen van widgets via JUnit mogelijk. Glance API ondersteunt nog niet alle RemoteViews-functies — voor complexe interactieve widgets is de klassieke aanpak beter. App Extensions in mobiele ontwikkeling op Android evolueren richting Glance API, waardoor het maken en onderhouden van widgets eenvoudiger wordt.
Content Provider is een Android-component voor het delen van gestructureerde gegevens tussen apps via een uniforme ContentResolver-interface. In tegenstelling tot iOS App Extensions creëert Content Provider geen apart proces — gegevens worden synchroon aangevraagd in de context van de aanroepende app. Content Provider vormt de basis van systeemintegraties op Android: contacten, mediabestanden, agenda en standaard apps gebruiken het om gegevens te publiceren.
FileProvider is een subklasse van ContentProvider voor veilige bestandsoverdracht tussen apps. FileProvider genereert tijdelijke content://-URI's in plaats van directe file://-paden, die verboden zijn op Android 7+. Om het te gebruiken, moet u files-path of external-files-path opgeven in de XML-configuratie. App Extensions in mobiele ontwikkeling op Android bestaan niet als apart concept, maar FileProvider vervult hun functie — het breidt de mogelijkheden voor het delen van gegevens uit buiten één app.
Op iOS wordt de rol van het delen van bestanden vervuld door File Provider Extension. File Provider Extension publiceert de bestanden van de app in de Bestanden-app via NSFileProviderManager. In tegenstelling tot FileProvider vereist de iOS-extensie een apart binair bestand en draait deze in een geïsoleerd proces. File Provider Extension ondersteunt NSFileProviderItem voor bestandsbeschrijving en NSFileProviderEnumerator voor navigatie door mappen. Systeemintegraties in mobiele apps via File Provider Extension stellen de gebruiker in staat om app-bestanden te beheren vanuit de Bestanden-app zonder deze te openen.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
Het voorbeeld toont een minimale implementatie van File Provider Extension in Swift. De methode item(for:) retourneert een NSFileProviderItem-object op basis van identifier — het systeem roept deze aan bij het weergeven van bestanden in de Bestanden-app.
Veelgestelde vragen
App Extensions zijn aparte binaire bestanden die de functionaliteit van de app uitbreiden buiten het proces: Today Widget, Share Extension, Action Extension, Keyboard Extension en andere typen die in een geïsoleerde omgeving draaien.
CallKit integreert VoIP-gesprekken in de systeemgespreksinterface met weergave op het vergrendelde scherm. PushKit levert pushmeldingen op de achtergrond zonder ze aan de gebruiker te tonen — het wekt de app om gegevens te verwerken, zoals informatie over een inkomend gesprek.
BroadcastReceiver is een Android-component die reageert op systeembroadcastberichten: opstarten van apparaat (BOOT_COMPLETED), netwerkverbinding (CONNECTIVITY_ACTION), vliegtuigmoduswijzigingen en andere besturingssysteemgebeurtenissen.
Gebruik AppWidgetProvider met RemoteViews voor het maken van de widgetinterface of Glance API (Jetpack) voor de Kotlin DSL-aanpak. De widget wordt geregistreerd in het manifest via een XML-beschrijving die de grootte en updatefrequentie specificeert.
Content Provider is een Android-component voor het delen van gegevens tussen apps via ContentResolver. Het wordt gebruikt voor toegang tot contacten, mediabestanden en alle gestructureerde gegevens uit andere apps.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.