Action Extension é uma extensão iOS que executa ações personalizadas em conteúdo de outros aplicativos sem alternar de contexto. Ao contrário do Share Extension, que envia dados para outro aplicativo, o Action Extension transforma o conteúdo no local: traduz texto, altera filtros de imagem, verifica ortografia ou gera PDF. De acordo com a Apple (2024), o Action Extension é o segundo tipo de extensão mais popular depois do Share Extension, usado em 42% dos aplicativos da categoria “Produtividade”. A ação instantânea sem iniciar o aplicativo principal é a principal vantagem para o usuário.
Principais pontos
Action Extension é um tipo de extensão iOS que permite realizar ações em conteúdo diretamente no contexto do aplicativo host. O usuário seleciona texto no Safari, toca em “Ações” e escolhe, por exemplo, “Verificar ortografia” — a extensão processa o texto e retorna o resultado sem sair do navegador. A extensão recebe dados de entrada via NSExtensionContext e pode retornar conteúdo modificado.
O Action Extension apareceu no iOS 8 como parte da arquitetura de extensões de aplicativos. Sua principal característica é que a extensão não tem interface própria (opcional) e é executada no contexto do aplicativo host. O usuário não sai da tela atual, garantindo atrito cognitivo mínimo. Segundo a Apple, o Action Extension é o único tipo de extensão que pode ler e modificar simultaneamente o conteúdo do aplicativo host (via NSExtensionContext com retorno de resultado).
O Action Extension é usado em diversos cenários: traduzir texto no navegador, criar PDF a partir de uma página web, aplicar filtro a uma foto na galeria, verificar ortografia em qualquer campo de texto, encurtar URL, criptografar texto e adicionar favoritos. A versatilidade torna o Action Extension uma ferramenta popular para aplicativos das categorias “Utilitários” e “Produtividade”.
Action Extension e Share Extension são frequentemente confundidos, mas seus propósitos são fundamentalmente diferentes. O Share Extension envia conteúdo do aplicativo host para o seu aplicativo; o Action Extension processa o conteúdo e o devolve. A diferença afeta a arquitetura, a experiência do usuário e os requisitos de configuração do Info.plist.
| Característica | Action Extension | Share Extension |
|---|---|---|
| Propósito | Transformação de conteúdo | Transferência de conteúdo para o aplicativo |
| Interface | Opcional (personalizada) | SLComposeServiceViewController |
| Retorno de dados | Sim, via completeRequest | Não |
| Contexto | Permanece no aplicativo host | Alterna para a extensão |
| Posição no menu | Action Sheet (parte superior) | Share Sheet (parte inferior) |
| Ação típica | Tradução, correção, filtro | Salvar, publicar |
O Action Extension aparece no menu de ações (Action Sheet) ao tocar no botão “Compartilhar” ou “...”. O iOS coloca automaticamente os Action Extensions na parte superior da folha (ações) e os Share Extensions na parte inferior (aplicativos). Cenário do usuário: selecionou texto → tocou em “Ações” → escolheu seu Action Extension → recebeu o resultado processado sem alternar de aplicativo.
O Action Extension consiste em um target no Xcode, um UIViewController para exibir a interface (opcional), NSExtensionContext para entrada/saída de dados e configuração Info.plist. A arquitetura é mais simples que a do Share Extension: não há interface de composição obrigatória e a extensão pode funcionar completamente sem UI.
Target — um bundle separado com um identificador herdado do aplicativo principal. UIViewController — interface opcional para exibir progresso, configurações ou resultados. NSExtensionContext — um contêiner com dados de entrada (inputItems) e o método completeRequest para retornar resultados. Info.plist — configuração de ativação via NSExtensionActivationRule e atributos (NSExtensionAttributes) para especificar os tipos de conteúdo suportados.
O Action Extension recebe dados de entrada via extensionContext?.inputItems — um array de NSExtensionItem. Cada item contém anexos com dados e UTI. Após o processamento, a extensão chama completeRequest(returningItems:) com um array de NSExtensionItem de saída. O aplicativo host recebe os dados processados e os exibe. Modelo assíncrono: a extensão pode realizar operações longas, mantendo o contexto por até 30 segundos.
Vamos criar um Action Extension em Swift para traduzir texto selecionado. A extensão recebe texto do aplicativo host, envia para um servidor de tradução e retorna o resultado. ActionViewController é o controlador base criado pelo Xcode ao adicionar um target.
import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
extractTextAndTranslate()
}
func extractTextAndTranslate() {
guard let item = extensionContext?.inputItems.first
as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(
forTypeIdentifier: kUTTypePlainText as String
) { [weak self] (text, error) in
guard let inputText = text as? String else { return }
TranslationService().translate(inputText, from: "en", to: "ru") {
translated in
DispatchQueue.main.async {
self?.resultLabel?.text = translated
}
}
}
}
}
}
Após o processamento, a extensão retorna o resultado ao aplicativo host. completeRequest com dados de saída é um cenário alternativo onde a extensão não mostra uma UI, mas retorna imediatamente o conteúdo processado.
// Returning processed text to host app
let resultItem = NSExtensionItem()
let resultData = translated.data(using: .utf8)!
let attachment = NSItemProvider(
item: resultData,
typeIdentifier: kUTTypePlainText as String
)
resultItem.attachments = [attachment]
extensionContext?.completeRequest(
returningItems: [resultItem], completionHandler: nil
)
O Action Extension pode funcionar em dois modos: com UI e sem UI. No modo sem UI, a extensão realiza a ação completamente em segundo plano e chama completeRequest imediatamente após o processamento. No modo com UI, a extensão mostra um controlador, o usuário confirma a ação e só então o completeRequest envia o resultado. A seleção do modo depende da complexidade da ação e da necessidade de entrada do usuário.
O método loadItem(forTypeIdentifier:) funciona de forma assíncrona — os dados podem ser grandes (imagens, vídeos). O NSItemProvider gerencia o streaming e o cache. Para imagens use kUTTypeImage, para arquivos use kUTTypeFileURL. Importante: loadItem pode ser chamado em uma thread de fundo — atualize a UI apenas via DispatchQueue.main.
O Action Extension retorna dados processados via completeRequest com um array de NSExtensionItem. Cada item corresponde ao tipo de dados de saída. O aplicativo host pode substituir o conteúdo original pelo processado — por exemplo, substituir a imagem original por uma filtrada. NSExtensionItem suporta as mesmas UTI da entrada, além de adicionais (por exemplo, public.html para conteúdo web).
O Action Extension é usado em dezenas de cenários — desde utilitários simples até fluxos de trabalho empresariais complexos. Exemplos clássicos abrangem operações de texto, gráficos e arquivos, bem como integração de conteúdo web.
Action Extension para texto: tradução, verificação ortográfica, contagem de caracteres, alteração de maiúsculas/minúsculas, criptografia, geração de código QR a partir de texto. O usuário seleciona texto em qualquer aplicativo com campo de texto (Safari, Notas, Mail) e realiza a ação com um toque. Realce de sintaxe de código, formatação Markdown e encurtamento de URL são exemplos populares de Action Extension para usuários avançados.
Para imagens, o Action Extension oferece: aplicar filtros, cortar, redimensionar, converter formatos (HEIC para JPEG), adicionar marca d'água, reconhecer texto (OCR) e compactar. O processamento de imagens deve ser rápido — o usuário espera um resultado em 2–3 segundos. Para operações pesadas, use Core Image na GPU ou filas em segundo plano.
Action Extension para URL: criar PDF a partir de uma página web, salvar no Pocket/Pinterest, verificar velocidade do site, arquivar página, obter metadados Open Graph, gerar captura de tela da página. A geração de PDF é um dos cenários mais procurados: o usuário converte uma página web em PDF sem abrir serviços de terceiros.
Perguntas frequentes
O Share Extension envia conteúdo do aplicativo host para o seu aplicativo. O Action Extension processa o conteúdo no local e retorna o resultado. Share — transferência, Action — transformação. Essa diferença fundamental determina a arquitetura e a UX.
Sim. Se a ação não exigir entrada do usuário (por exemplo, contagem de caracteres), a extensão pode realizá-la em segundo plano e retornar imediatamente o resultado via completeRequest. No Info.plist você precisa especificar NSExtensionActivationSupportsWebURL ou outra UTI que corresponda ao tipo de dados.
Em qualquer aplicativo que suporte UIActivityViewController ou controladores de ação padrão. Estes incluem Safari, Fotos, Arquivos, Notas, Mail e milhares de aplicativos de terceiros. O Action Extension não funciona em aplicativos que não usam os mecanismos de ação padrão do iOS.
Através de extensionContext.completeRequest(returningItems:) com um array de NSExtensionItem. Cada item de saída contém um NSItemProvider com os dados processados. O aplicativo host recebe o resultado no delegado do UIActivityViewController ou um callback similar.
A extensão executa por até 30 segundos, após os quais o iOS a encerra forçadamente. Não há acesso direto ao aplicativo principal — apenas através de App Groups. O Action Extension não pode realizar tarefas em segundo plano após a conclusão. Para operações longas, use NSURLSession em segundo plano com uma notificação no próximo início.
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.
Leia também