App Extensions são módulos executáveis separados que estendem as capacidades de um aplicativo móvel além de sua interface principal: Today Widget na tela inicial, manipulação de chamadas VoIP via CallKit e reação a eventos do sistema através de BroadcastReceiver. As integrações de sistema permitem que um aplicativo interaja com o sistema operacional em um nível profundo, desbloqueando recursos indisponíveis para telas comuns. De acordo com a Documentação de Desenvolvedor da Apple, cada extensão é executada em um processo isolado e gerenciada pelo sistema independentemente do aplicativo principal. App Extensions em um aplicativo móvel permitem implementar funcionalidades indisponíveis no processo principal.
Pontos-chave
As App Extensions no iOS surgiram no iOS 8 e se tornaram a base para integrações de sistema no desenvolvimento móvel. São binários separados empacotados com o aplicativo principal, mas executados em um processo isolado. Cada extensão tem seu próprio Info.plist e ponto de entrada definido via NSExtensionPrincipalClass. O sistema gerencia o ciclo de vida das App Extensions — elas não podem permanecer em segundo plano após concluir uma tarefa.
WidgetKit (iOS 14+) é um framework moderno para criar widgets na tela inicial. WidgetKit usa SwiftUI para descrever a interface e TimelineProvider para definir cronogramas de atualização. Os widgets vêm em três tamanhos: pequeno (2×2 células), médio (4×2) e grande (4×4). O antigo Today Widget baseado em UICollectionViewController ainda é suportado, mas a Apple recomenda migrar para WidgetKit. App Extensions no WidgetKit não suportam animação, entrada de teclado ou gestos — são elementos estáticos ou pseudo-animados com atualizações periódicas.
Share Extension permite enviar conteúdo de qualquer aplicativo para o seu através da folha de compartilhamento do sistema. Share Extension recebe dados via NSExtensionItem e usa SLComposeServiceViewController para a interface. Action Extension processa conteúdo no local — por exemplo, traduz texto no navegador sem mudar para outro aplicativo. Ambos os tipos devem concluir o trabalho em um tempo limitado, caso contrário, o sistema "mata" a extensão. Esta é uma limitação importante das App Extensions em um aplicativo móvel — tarefas em segundo plano não estão disponíveis no nível de extensão.
As Integrações de Sistema no iOS vão muito além dos widgets: CallKit, PushKit e SiriKit permitem que um aplicativo móvel funcione no nível do sistema. Esses frameworks exigem entitlements especiais, mas oferecem ao usuário uma experiência perfeita — chamadas via CallKit parecem chamadas telefônicas comuns, e a Siri processa solicitações sem abrir o aplicativo.
CallKit integra chamadas de aplicativos de terceiros na tela de chamadas do sistema, incluindo a tela bloqueada. O CXProvider registra o aplicativo como um serviço VoIP, e o CXCallController gerencia as chamadas. CallKit bloqueia automaticamente chamadas duplicadas e suporta Call Directory Extension para bloquear números indesejados. Integrações de sistema no desenvolvimento móvel com CallKit são críticas para aplicativos de comunicação por voz — WhatsApp, Skype e Zoom o usam para exibir chamadas recebidas.
PushKit entrega notificações push diretamente ao aplicativo móvel sem mostrá-las ao usuário. PushKit desperta o aplicativo de um estado "morto" e passa dados através do delegado PKPushRegistryDelegate. Este é o mecanismo principal para aplicativos VoIP: PushKit entrega informações de chamada, e CallKit as exibe. PushKit tem prioridade de entrega maior do que notificações push comuns e não requer exibição de banner. App Extensions em aplicativos móveis frequentemente combinam PushKit com CallKit para comunicação por voz.
SiriKit permite processar solicitações através da Siri e do aplicativo Atalhos. Intents Extension é uma App Extension separada que registra intenções suportadas e as processa. SiriKit suporta mais de 20 domínios: chamadas, mensagens, pagamentos, notas, treinos. Os Atalhos permitem que o usuário crie automações — por exemplo, "Enviar uma mensagem no WhatsApp via Siri." Integrações de sistema com SiriKit e Atalhos aumentam o engajamento, pois o usuário realiza ações sem abrir o aplicativo.
BroadcastReceiver é um componente Android que reage a mensagens de broadcast do sistema. Ao contrário das App Extensions do iOS, BroadcastReceiver não requer um binário separado — basta registrar o receptor no manifesto ou no código via Context.registerReceiver. Integrações de sistema no Android geralmente começam com BroadcastReceiver: desde iniciar um serviço na inicialização do dispositivo até reagir à conexão de rede.
IntentFilter vincula BroadcastReceiver a um evento de sistema específico. Eventos típicos: BOOT_COMPLETED (inicialização do dispositivo), CONNECTIVITY_ACTION (mudança de rede), BATTERY_LOW (bateria baixa), TIME_SET (mudança de horário). O receptor é registrado no AndroidManifest.xml ou via Context.registerReceiver para registro dinâmico. O registro dinâmico é preferível — não requer permissões no manifesto e funciona apenas enquanto o aplicativo está ativo. App Extensions no Android não existem como conceito, mas BroadcastReceiver desempenha um papel semelhante — estende as capacidades do aplicativo através de integrações de sistema.
NotificationListenerService é um serviço que recebe todas as notificações do sistema. NotificationListenerService requer a permissão BIND_NOTIFICATION_LISTENER_SERVICE e acesso através das configurações de acessibilidade. AccessibilityService é uma ferramenta mais poderosa para integração de sistema: pode ler o conteúdo da tela, simular cliques e automatizar ações. Ambos os serviços exigem ativação explícita pelo usuário nas configurações, o que melhora a segurança. Integrações de sistema em aplicativos móveis via AccessibilityService são usadas para auto-preenchimento, leitores de tela e ferramentas de acessibilidade.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
O exemplo registra um BroadcastReceiver para o evento BOOT_COMPLETED. WorkManager é usado para execução adiada de tarefas após a inicialização do dispositivo — esta é a abordagem padrão para aplicativos Android.
App Widget Provider no Android é o equivalente das App Extensions do iOS no contexto de widgets: é um componente que exibe conteúdo interativo na tela inicial. Ao contrário do WidgetKit, os widgets Android podem aceitar entrada do usuário — cliques, alternâncias e gestos. App Widget Provider é registrado no manifesto através de uma descrição XML do tamanho e frequência de atualização.
RemoteViews descreve a interface do widget através de um layout XML e suporta apenas um conjunto limitado de Views. RemoteViews não permite Views personalizadas — apenas componentes padrão: TextView, ImageView, Button, ProgressBar. AppWidgetProvider é a classe base que lida com atualizações, ativação e exclusão do widget. O método onUpdate é chamado por timer via updatePeriodMillis ou via WorkManager para controle preciso. Integrações de sistema com widgets no Android exigem cautela — atualizações muito frequentes consomem a bateria.
Glance API é uma biblioteca Jetpack para criar widgets usando Kotlin DSL em vez de XML. Glance API compila para RemoteViews e suporta sintaxe semelhante ao Compose: GlanceComposable, Column, Row, Text. A biblioteca resolve o problema de código XML complexo e permite testar widgets via JUnit. Glance API ainda não suporta todos os recursos do RemoteViews — para widgets interativos complexos, a abordagem clássica é melhor. App Extensions no desenvolvimento móvel no Android estão evoluindo em direção ao Glance API, simplificando a criação e manutenção de widgets.
Content Provider é um componente Android para compartilhar dados estruturados entre aplicativos através de uma interface unificada ContentResolver. Ao contrário das App Extensions do iOS, Content Provider não cria um processo separado — os dados são solicitados de forma síncrona no contexto do aplicativo chamador. Content Provider é a base das integrações de sistema no Android: contatos, arquivos de mídia, calendário e aplicativos padrão o usam para publicar dados.
FileProvider é uma subclasse de ContentProvider para transferência segura de arquivos entre aplicativos. FileProvider gera URIs temporários content:// em vez de caminhos diretos file://, que são proibidos no Android 7+. Para usar, é necessário especificar files-path ou external-files-path na configuração XML. App Extensions no desenvolvimento móvel no Android não existem como conceito separado, mas FileProvider desempenha sua função — estende as capacidades de compartilhamento de dados além de um aplicativo.
No iOS, o papel do compartilhamento de arquivos é desempenhado pelo File Provider Extension. File Provider Extension publica os arquivos do aplicativo no aplicativo Arquivos através do NSFileProviderManager. Ao contrário do FileProvider, a extensão iOS requer um binário separado e é executada em um processo isolado. File Provider Extension suporta NSFileProviderItem para descrição de arquivos e NSFileProviderEnumerator para navegação em pastas. Integrações de sistema em aplicativos móveis via File Provider Extension permitem que o usuário gerencie arquivos do aplicativo a partir do aplicativo Arquivos sem abri-lo.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
O exemplo mostra uma implementação mínima do File Provider Extension em Swift. O método item(for:) retorna um objeto NSFileProviderItem por identificador — o sistema o chama ao exibir arquivos no aplicativo Arquivos.
Perguntas Frequentes
App Extensions são binários separados que estendem a funcionalidade do aplicativo além de seu processo: Today Widget, Share Extension, Action Extension, Keyboard Extension e outros tipos executados em um ambiente isolado.
CallKit integra chamadas VoIP na interface de chamadas do sistema com exibição na tela bloqueada. PushKit entrega notificações push em segundo plano sem mostrá-las ao usuário — ele desperta o aplicativo para processar dados, como informações sobre uma chamada recebida.
BroadcastReceiver é um componente Android que reage a mensagens de broadcast do sistema: inicialização do dispositivo (BOOT_COMPLETED), conexão de rede (CONNECTIVITY_ACTION), mudanças de modo avião e outros eventos do SO.
Use AppWidgetProvider com RemoteViews para criar a interface do widget ou Glance API (Jetpack) para a abordagem Kotlin DSL. O widget é registrado no manifesto através de uma descrição XML especificando o tamanho e a frequência de atualização.
Content Provider é um componente Android para compartilhar dados entre aplicativos via ContentResolver. É usado para acessar contatos, arquivos de mídia e quaisquer dados estruturados de outros aplicativos.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.