Concrete Logo
Hamburger button

Primeiros passos no iOS 8: Share Extension

  • Blog
  • 22 de Junho de 2015
Share

Com o lançamento do iOS8 vieram também algumas novidades, como o Apple Watch, widgets na aba ‘Hoje’ e, além de outras novas extensões, o Share Extension. Nós, desenvolvedores, já sentíamos falta dessa possibilidade há um tempo, principalmente de uma tela que mostrasse as opções possíveis. Foi exatamente assim que a nova extensão foi construída: configurável pelo usuário e com várias opções de comunicação disponíveis para cada ação diferente.

Para deixar tudo mais claro, vamos construir um App Extension que receba apenas vídeos para serem postados.

Criando o Projeto e Extensão

Crie o projeto no Xcode. Vá em New > Project.., selecione Single View Application e finalize.

Agora precisamos criar um novo Target em File > New… >Target

image03

image08

Com isso, temos um app e um target a mais. Perfeito!

Repare que o Xcode gerou, além do novo Target (à direita), uma pasta a mais incluindo uma Storyboard só para o fluxo do Extension e a ShareViewController, que abordaremos no final.

image00

App Groups

Um dos principais conceitos do Share Extension é se comunicar com outros apps e, para isso, a Apple recomenda o uso do NSUserDefaults como ponto de encontro entre o app e a extensão. Ativando os App Groups, criamos IDs únicos que, ao usarmos no app e extensão, dividimos o conteúdo com direito à escrita e leitura.

Obs: É necessário ter conta de desenvolvimento ativa para a ativação.

Target (App e Extensão) > Capabilities > AppGroups

image06

Depois disso, é só instanciar usando o ID do AppGroup e pronto! Sugiro guardar em uma constante para evitar erros de digitação.

Verificando o tipo de conteúdo

Como definimos no início, o app desse post deve conseguir compartilhar vídeos e sempre um de cada vez, certo? Mas como garantir isso?

Na pasta do ShareExtension, em Supporting Files >  Info.plist, podemos encontrar a chave NSExtension > NSExtensionAttributes > NSExtensionActivationRule, ou seja, a regra de quando seu app vai estar disponível para compartilhar o conteúdo.

O NSExtensionActivationRule pode receber vários valores e por default vem com TRUEPREDICATE, aceitando qualquer entrada, como por exemplo do tipo NSPredicate, usando uma string. Segue exemplo da Apple para somente um arquivo PDF:

Essa string pode ser colada e usada como um NSExtensionActivationRule válido.

Como Dictionary, a Apple fornece as seguintes opções:

NSExtensionActivationSupportsAttachmentsWithMaxCount: Define um número máximo de anexos

NSExtensionActivationSupportsAttachmentsWithMinCount: Define um número mínimo de anexos

NSExtensionActivationSupportsFileWithMaxCount: Define um número maximo de arquivos

NSExtensionActivationSupportsImageWithMaxCount: Define um número máximo de imagens

NSExtensionActivationSupportsMovieWithMaxCount: Define um número máximo de vídeos

NSExtensionActivationSupportsText: Define se pode ser um texto

NSExtensionActivationSupportsWebURLWithMaxCount: Define um número máximo de URLs

NSExtensionActivationSupportsWebPageWithMaxCount: Define um número máximo de páginas

No videoRepost teremos:

image01

Podemos, então, rodar o projeto e ver como se comporta:

image09

image04

 

 

 

 

 

 

 

 

 

 

 

Repare que ele não aparece em outras quantidades ou tipos de conteúdos:

image05image10

 

 

 

 

 

 

 

 

 

 

 

ShareViewController

Chegou a hora de editar o comportamento Share Extension. Logo vemos que a ShareViewController tem alguns métodos diferentes, principalmente sua nova classe, SLComposeServiceViewController.

A SLComposeServiceViewController é a ViewController padrão. Portanto, a tela a seguir é resultado dela e é editável:

image07

Os métodos são bem autoexplicativos e seguem o padrão de construção de uma ViewController, mas vamos listar junto com eles as propriedades que podemos usar para customizar:

presentationAnimationDidFinish: comparável ao viewDidLoad de uma controller padrão

contentText: a string com o texto de compartilhamento. No nosso caso,  “Compartilhando…”;

didSelectPost: ação do botão na tela de compartilhamento;

didSelectCancel: ação do botão na tela de compartilhamento;

isContentValid: de retorno BOOL, é chamado toda vez que algo muda na view, incluindo cada vez que o contextString muda;

charactersRemaining: número de caracteres restantes que aparece na view. Fica vermelho automaticamente ao se tornar negativo;

loadPreviewView: permite retornar uma view customizada que vai ser apresentada no lado direito do ShareSheet. Para o nosso app, o preview do vídeo é automático.

configurationItems: um array de SLComposeSheetConfigurationItems que é anexado abaixo do ShareSheet, com configuração no toque, geralmente usada pra abrir uma seleção em uma table ou qualquer outra ação.

Exemplo:

image02

Extraindo os dados selecionados

Depois de acertar toda a configuração e deixar tudo do jeito esperado, precisamos extrair o vídeo que selecionamos e compartilhar com o app.

No videoRepost limitamos o arquivo sempre a um só, ficando mais fácil de extrair:

Importando o MobileCoreServices, temos disponível um leque de constantes, como o kUTTypeQuickTimeMovie, que usamos no exemplo acima para garantir que o anexo era do tipo esperado na extração do NSData.

Por fim, na Controller principal podemos consultar o pendingPosts no sharedDefaults e saber se tem algum post recente a ser compartilhado.

Conclusão

Com essa comunicação bem simples, já fica claro que o novo Share Extension tem um potencial incrível por dar tantas novas opções aplicáveis a qualquer regra de negócio. Seria impossível em um único post cobrir todas as funcionalidades das quais o novo Share é capaz. Como desenvolvedor, gosto de entender como as coisas funcionam e a partir daí aprofundar os conhecimentos. Sendo assim, espero ter ajudado a acelerar o aprendizado para o desenvolvimento de seu app. Dúvidas, sugestões ou comentários? Utilize os campos abaixo!