Le App Extensions sono moduli eseguibili separati che estendono le capacità di un'app mobile oltre la sua interfaccia principale: Today Widget sulla schermata Home, gestione delle chiamate VoIP tramite CallKit e reazione agli eventi di sistema tramite BroadcastReceiver. Le integrazioni di sistema consentono a un'app di interagire con il sistema operativo a un livello profondo, sbloccando funzionalità non disponibili per le schermate normali. Secondo la Documentazione per Sviluppatori Apple, ogni estensione viene eseguita in un processo isolato e gestita dal sistema indipendentemente dall'app principale. Le App Extensions in un'app mobile consentono di implementare funzionalità non disponibili nel processo principale.
Punti chiave
Le App Extensions su iOS sono apparse in iOS 8 e sono diventate il fondamento delle integrazioni di sistema nello sviluppo mobile. Sono binari separati inclusi nell'app principale, ma avviati in un processo isolato. Ogni estensione ha il proprio Info.plist e un punto di ingresso definito tramite NSExtensionPrincipalClass. Il sistema gestisce il ciclo di vita delle App Extensions — non possono rimanere in background dopo aver completato un'attività.
WidgetKit (iOS 14+) è un framework moderno per creare widget sulla schermata Home. WidgetKit utilizza SwiftUI per descrivere l'interfaccia e TimelineProvider per definire gli orari di aggiornamento. I widget sono disponibili in tre dimensioni: piccolo (2×2 celle), medio (4×2) e grande (4×4). Il vecchio Today Widget basato su UICollectionViewController è ancora supportato, ma Apple consiglia di migrare a WidgetKit. Le App Extensions su WidgetKit non supportano animazioni, input da tastiera o gesti — sono elementi statici o pseudo-animati con aggiornamenti periodici.
Share Extension consente di inviare contenuti da qualsiasi app alla tua tramite il foglio di condivisione di sistema. Share Extension riceve i dati tramite NSExtensionItem e utilizza SLComposeServiceViewController per l'interfaccia. Action Extension elabora i contenuti sul posto — ad esempio, traduce il testo nel browser senza passare a un'altra app. Entrambi i tipi devono completare il lavoro in un tempo limitato, altrimenti il sistema "uccide" l'estensione. Questa è una limitazione importante delle App Extensions in un'app mobile — le attività in background non sono disponibili a livello di estensione.
Le integrazioni di sistema su iOS vanno ben oltre i widget: CallKit, PushKit e SiriKit consentono a un'app mobile di funzionare a livello di sistema. Questi framework richiedono entitlements speciali, ma offrono all'utente un'esperienza fluida — le chiamate tramite CallKit appaiono come normali chiamate telefoniche e Siri gestisce le richieste senza aprire l'app.
CallKit integra le chiamate di app di terze parti nella schermata di chiamata di sistema, inclusa la schermata bloccata. CXProvider registra l'app come servizio VoIP e CXCallController gestisce le chiamate. CallKit blocca automaticamente le chiamate duplicate e supporta Call Directory Extension per bloccare i numeri indesiderati. Le integrazioni di sistema nello sviluppo mobile con CallKit sono fondamentali per le app di comunicazione vocale — WhatsApp, Skype e Zoom lo utilizzano per visualizzare le chiamate in arrivo.
PushKit consegna le notifiche push direttamente all'app mobile senza mostrarle all'utente. PushKit riattiva l'app da uno stato "ucciso" e passa i dati tramite il delegato PKPushRegistryDelegate. Questo è il meccanismo principale per le app VoIP: PushKit consegna le informazioni sulla chiamata e CallKit le visualizza. PushKit ha una priorità di consegna più alta rispetto alle notifiche push normali e non richiede la visualizzazione di un banner. Le App Extensions nelle app mobili spesso combinano PushKit con CallKit per la comunicazione vocale.
SiriKit consente di gestire le richieste tramite Siri e l'app Comandi. Intents Extension è un'App Extension separata che registra gli intent supportati e li elabora. SiriKit supporta oltre 20 domini: chiamate, messaggi, pagamenti, note, allenamenti. I Comandi Rapidi consentono all'utente di creare automazioni — ad esempio, "Invia un messaggio in WhatsApp tramite Siri." Le integrazioni di sistema con SiriKit e Comandi Rapidi aumentano il coinvolgimento poiché l'utente esegue azioni senza aprire l'app.
BroadcastReceiver è un componente Android che reagisce ai messaggi di broadcast di sistema. A differenza delle App Extensions iOS, BroadcastReceiver non richiede un binario separato — è sufficiente registrare il ricevitore nel manifest o nel codice tramite Context.registerReceiver. Le integrazioni di sistema su Android spesso iniziano con BroadcastReceiver: dall'avvio di un servizio all'accensione del dispositivo alla reazione alla connessione di rete.
IntentFilter lega BroadcastReceiver a uno specifico evento di sistema. Eventi tipici: BOOT_COMPLETED (accensione dispositivo), CONNECTIVITY_ACTION (cambio rete), BATTERY_LOW (batteria scarica), TIME_SET (cambio ora). Il ricevitore viene registrato in AndroidManifest.xml o tramite Context.registerReceiver per la registrazione dinamica. La registrazione dinamica è preferibile — non richiede permessi nel manifest e funziona solo mentre l'app è attiva. Le App Extensions su Android non esistono come concetto, ma BroadcastReceiver svolge un ruolo simile — estende le capacità dell'app attraverso integrazioni di sistema.
NotificationListenerService è un servizio che riceve tutte le notifiche di sistema. NotificationListenerService richiede il permesso BIND_NOTIFICATION_LISTENER_SERVICE e l'accesso tramite le impostazioni di accessibilità. AccessibilityService è uno strumento più potente per l'integrazione di sistema: può leggere il contenuto dello schermo, simulare clic e automatizzare azioni. Entrambi i servizi richiedono un'attivazione esplicita da parte dell'utente nelle impostazioni, migliorando la sicurezza. Le integrazioni di sistema nelle app mobili tramite AccessibilityService vengono utilizzate per compilatori automatici, lettori di schermo e strumenti di accessibilità.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
L'esempio registra un BroadcastReceiver per l'evento BOOT_COMPLETED. WorkManager viene utilizzato per l'esecuzione differita di attività dopo l'accensione del dispositivo — questo è l'approccio standard per le app Android.
App Widget Provider su Android è l'equivalente delle App Extensions iOS nel contesto dei widget: è un componente che visualizza contenuti interattivi sulla schermata Home. A differenza di WidgetKit, i widget Android possono accettare input dell'utente — clic, interruttori e gesti. App Widget Provider viene registrato nel manifest tramite una descrizione XML della dimensione e della frequenza di aggiornamento.
RemoteViews descrive l'interfaccia del widget tramite un layout XML e supporta solo un insieme limitato di View. RemoteViews non consente View personalizzate — solo componenti standard: TextView, ImageView, Button, ProgressBar. AppWidgetProvider è la classe base che gestisce gli aggiornamenti, l'attivazione e l'eliminazione del widget. Il metodo onUpdate viene chiamato tramite timer usando updatePeriodMillis o tramite WorkManager per un controllo preciso. Le integrazioni di sistema con i widget su Android richiedono cautela — aggiornamenti troppo frequenti scaricano la batteria.
Glance API è una libreria Jetpack per creare widget utilizzando Kotlin DSL invece di XML. Glance API viene compilata in RemoteViews e supporta una sintassi simile a Compose: GlanceComposable, Column, Row, Text. La libreria risolve il problema del codice XML complesso e consente di testare i widget tramite JUnit. Glance API non supporta ancora tutte le funzionalità di RemoteViews — per widget interattivi complessi, l'approccio classico è migliore. Le App Extensions nello sviluppo mobile su Android si stanno evolvendo verso Glance API, semplificando la creazione e la manutenzione dei widget.
Content Provider è un componente Android per condividere dati strutturati tra app tramite un'interfaccia unificata ContentResolver. A differenza delle App Extensions iOS, Content Provider non crea un processo separato — i dati vengono richiesti in modo sincrono nel contesto dell'app chiamante. Content Provider è il fondamento delle integrazioni di sistema su Android: contatti, file multimediali, calendario e app standard lo utilizzano per pubblicare dati.
FileProvider è una sottoclasse di ContentProvider per il trasferimento sicuro di file tra app. FileProvider genera URI temporanei content:// invece dei percorsi file:// diretti, che sono proibiti su Android 7+. Per utilizzarlo, è necessario specificare files-path o external-files-path nella configurazione XML. Le App Extensions nello sviluppo mobile su Android non esistono come concetto separato, ma FileProvider svolge la loro funzione — estende le capacità di condivisione dei dati oltre una singola app.
Su iOS, il ruolo della condivisione di file è svolto da File Provider Extension. File Provider Extension pubblica i file dell'app nell'app File tramite NSFileProviderManager. A differenza di FileProvider, l'estensione iOS richiede un binario separato e viene eseguita in un processo isolato. File Provider Extension supporta NSFileProviderItem per la descrizione dei file e NSFileProviderEnumerator per la navigazione nelle cartelle. Le integrazioni di sistema nelle app mobili tramite File Provider Extension consentono all'utente di gestire i file dell'app dall'app File senza aprirla.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
L'esempio mostra un'implementazione minima di File Provider Extension in Swift. Il metodo item(for:) restituisce un oggetto NSFileProviderItem per identificatore — il sistema lo chiama quando visualizza i file nell'app File.
Domande frequenti
Le App Extensions sono binari separati che estendono la funzionalità dell'app oltre il suo processo: Today Widget, Share Extension, Action Extension, Keyboard Extension e altri tipi che vengono eseguiti in un ambiente isolato.
CallKit integra le chiamate VoIP nell'interfaccia di chiamata di sistema con visualizzazione sulla schermata bloccata. PushKit consegna notifiche push in background senza mostrarle all'utente — riattiva l'app per elaborare dati, come le informazioni su una chiamata in arrivo.
BroadcastReceiver è un componente Android che reagisce ai messaggi di broadcast di sistema: accensione del dispositivo (BOOT_COMPLETED), connessione di rete (CONNECTIVITY_ACTION), cambi di modalità aereo e altri eventi del sistema operativo.
Utilizza AppWidgetProvider con RemoteViews per creare l'interfaccia del widget o Glance API (Jetpack) per l'approccio Kotlin DSL. Il widget viene registrato nel manifest tramite una descrizione XML che specifica la dimensione e la frequenza di aggiornamento.
Content Provider è un componente Android per condividere dati tra app tramite ContentResolver. Viene utilizzato per accedere a contatti, file multimediali e qualsiasi dato strutturato da altre app.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.