Share Extension é uma extensão do iOS que adiciona o seu aplicativo ao menu Compartilhar do sistema. O usuário pode enviar conteúdo do Safari, Fotos, Arquivos ou qualquer outro aplicativo diretamente para o seu — sem copiar e alternar entre janelas. De acordo com a Apple (2024), aplicativos com Share Extension recebem 35% mais conteúdo do usuário do que aplicativos sem capacidade de compartilhamento. A extensão processa texto, imagens, vídeo, URLs e arquivos através de uma interface unificada NSExtensionItem.
Pontos principais
Share Extension é um tipo de extensão de aplicativo do iOS que aparece no menu Compartilhar do sistema ao selecionar conteúdo em qualquer aplicativo. O usuário destaca texto no Safari, toca em Compartilhar e vê o seu aplicativo na lista de ações disponíveis. Após a seleção, o conteúdo é passado para a extensão para processamento: salvar, publicar, enviar ou transformar.
Ao contrário da Action Extension, a Share Extension é especializada em receber conteúdo de aplicativos externos. A Action Extension, por outro lado, envia dados do seu aplicativo para fora. A Share Extension é um ponto de entrada de conteúdo do usuário, um elemento-chave para aquisição de usuários: os usuários experimentam o seu aplicativo através da Share Extension sem instalá-lo completamente. A App Store proíbe aplicativos cuja única função é exibir anúncios através da Share Extension (App Store Review Guideline 4.2).
A Share Extension reduz a barreira de entrada: os usuários enviam conteúdo para o seu aplicativo a partir de um contexto familiar — navegador, galeria, gerenciador de arquivos. De acordo com a Branch (2024), aplicativos com Share Extension mostram retenção 28% maior no 7º dia. Um efeito adicional é a viralidade: cada vez que um usuário vê o seu aplicativo na folha Compartilhar, ocorre branding passivo sem gastos com publicidade.
O mecanismo da Share Extension é baseado na transferência de conteúdo através de contêineres do sistema NSExtensionItem. O aplicativo hospedeiro (Safari, Fotos) empacota o conteúdo selecionado em um NSExtensionItem com um tipo especificado (public.image, public.url, public.plain-text). O sistema passa este contêiner para a extensão, que extrai os dados através de extensionContext.inputItems.
A Share Extension é executada em um processo separado com tempo de execução limitado — cerca de 30 segundos para processamento. A extensão não deve realizar operações síncronas longas. Para carregar arquivos grandes, use NSURLSession com configuração em segundo plano. SLComposeServiceViewController é a classe base para Share Extension com visualização de conteúdo e botão de envio.
O iOS usa Uniform Type Identifiers (UTI) para determinar o tipo de conteúdo sendo transferido. Principais UTIs para Share Extension: public.image (fotos, capturas de tela), public.url (links), public.plain-text (texto), public.video (arquivos de vídeo) e public.file-url (arquivos). A extensão registra as UTIs suportadas no Info.plist através da chave NSExtensionActivationRule.
A Share Extension consiste em três componentes: o target no Xcode, o SLComposeServiceViewController e a configuração do Info.plist. A arquitetura determina quais tipos de conteúdo são processados, como a interface é exibida e onde os dados são salvos.
| Componente | Finalidade | Características |
|---|---|---|
| Target | Target da extensão no Xcode | Bundle separado com um identificador |
| ViewController | Interface e lógica de processamento | SLComposeServiceViewController ou personalizado |
| Info.plist | Configuração de ativação e UTI | NSExtensionActivationRule com predicados |
| App Groups | Armazenamento compartilhado com o aplicativo | UserDefaults suite para transferência de dados |
O elemento-chave da configuração da Share Extension é a regra de ativação. Ela determina em quais condições a extensão aparece na folha Compartilhar. A regra é definida no Info.plist como um dicionário com restrições: número máximo de imagens, comprimento mínimo de texto, presença obrigatória de URL. A regra padrão ativa a extensão para qualquer tipo único de conteúdo.
// Info.plist — NSExtensionActivationRule para Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Vamos ver um exemplo prático de criação de uma Share Extension em Swift para um aplicativo de favoritos. A extensão recebe uma URL do Safari, exibe uma interface de visualização e salva o link no App Group. SLComposeServiceViewController fornece uma interface de usuário pronta com um campo de texto e um botão Publicar.
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
override func isContentValid() -> Bool {
return !(contentText?.isEmpty() ?? true)
}
override func didSelectPost() {
guard let item = extensionContext?.inputItems.first as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String) {
[weak self] (item, error) in
if let url = item as? URL {
BookmarkService().save(url, title: self?.contentText)
}
self?.extensionContext?.completeRequest(
returningItems: [], completionHandler: nil)
}
}
}
}
Após enviar o conteúdo, a extensão finaliza chamando completeRequest — este é um passo obrigatório; sem ele, o sistema não liberará o processo da extensão. Importante: a Share Extension é executada em um ambiente limitado com acesso restrito à rede e ao sistema de arquivos — use sessões em segundo plano para upload de conteúdo.
A Share Extension deve lidar corretamente com diferentes tipos de dados de entrada: texto, imagens, vídeo, URLs e arquivos. Cada tipo usa sua própria UTI e método de extração. Manipulação universal — iterando por attachment.attachments com verificações hasItemConformingToTypeIdentifier.
As imagens são passadas como public.image com a capacidade de obtê-las via UIImage ou Data. Para imagens grandes, use jpegData(compressionQuality:) antes de salvar. A Share Extension não deve modificar a imagem original sem permissão explícita do usuário. Recomenda-se salvar o original no App Group e criar uma visualização para exibição na interface.
Safari e outros navegadores passam URLs como public.url e texto selecionado como public.plain-text. Um único NSExtensionItem pode conter ambos os tipos simultaneamente — a URL da página e o texto selecionado nela. A Share Extension deve verificar todos os anexos e extrair os dados relevantes. Cenário combinado: salvar a URL como favorito e o texto como uma nota anexada a ele.
A Share Extension e o aplicativo principal são executados em processos diferentes e não compartilham acesso ao sistema de arquivos. A troca de dados usa o mecanismo de App Groups: um contêiner compartilhado com um identificador group.*. Após salvar dados no App Group, a extensão notifica o aplicativo através de CFNotificationCenter ou Darwin Notify.
Os App Groups são ativados nas Capacidades do target: selecione App Groups e adicione um identificador (por exemplo, group.com.example.myapp). Ambos os targets — o aplicativo principal e a extensão — devem ter acesso ao mesmo grupo. UserDefaults suite permite ler e escrever dados no armazenamento compartilhado com sobrecarga mínima.
// Salvando dados no App Group a partir da Share Extension
let sharedDefaults = UserDefaults(suiteName: "group.com.example.myapp")
let bookmark: [String: Any] = [
"url": url.absoluteString,
"title": contentText ?? "",
"date": Date().timeIntervalSince1970
]
sharedDefaults?.set(bookmark, forKey: "bookmark_\(Date().timeIntervalSince1970)")
sharedDefaults?.synchronize()
Perguntas frequentes
A Share Extension recebe conteúdo de outros aplicativos para o seu. A Action Extension, por outro lado, executa uma ação sobre o conteúdo dentro do aplicativo hospedeiro — traduzir texto, modificar uma imagem. Share Extension é recebimento, Action Extension é transformação.
Depende do tipo de conteúdo que seu aplicativo processa. Para favoritos — public.url. Para um editor de fotos — public.image. Para notas — public.plain-text. Para vários tipos, use NSExtensionActivationRule com uma combinação de predicados AND/OR.
Uma causa comum é uma regra NSExtensionActivationRule incorreta ou incompatibilidade de UTI. Verifique no Info.plist: a regra de ativação deve corresponder ao tipo de conteúdo testado. Certifique-se também de que a extensão esteja ativada em Ajustes → seu aplicativo → Siri e Busca. Xcode clean build geralmente resolve o problema.
O sistema aloca cerca de 30 segundos para execução. Depois disso, o iOS encerra forçosamente o processo da extensão. Para operações de longa duração, use uma NSURLSession em segundo plano e trate o resultado na próxima inicialização do aplicativo.
Sim, em vez de SLComposeServiceViewController você pode usar um UIViewController normal. Neste caso, você tem controle total sobre a interface. No entanto, você precisa implementar os botões de enviar e cancelar por conta própria. Interface personalizada é recomendada para cenários não padronizados de processamento de conteúdo.
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