O Web Share Target permite que os PWAs recebam conteúdo compartilhado de outros apps instalados no dispositivo. Esse recurso pode ser usado, por exemplo, por aplicativos como editores de imagem para receber uma imagem de um app de câmera ou uma rede social para receber uma imagem ou um vídeo para compartilhamento.
A partir do Chrome 86, o Destino de compartilhamento da Web também está disponível para apps que usam a Atividade confiável na Web. Embora o PWA funcione imediatamente, algumas mudanças são necessárias no app Android.
Este artigo pressupõe que o desenvolvedor esteja familiarizado com as atividades confiáveis na Web. Os leitores que não conhecem a tecnologia podem começar com o Guia de integração.
Na mesma linha, uma explicação completa da implementação do alvo de compartilhamento da Web em um PWA está fora do escopo, e os desenvolvedores podem encontrar mais informações neste artigo.
O aplicativo de demonstração em https://scrapbook-pwa.web.app/ será usado como PWA para este artigo, e o código-fonte está disponível no GitHub (em inglês), e o aplicativo Android é baseado na demonstração básica de Atividade na Web confiável.
Adicionar destino de compartilhamento da Web ao app Android
Para modificar um aplicativo baseado em Atividade confiável na Web para implementar o Destino de compartilhamento da Web, são necessárias modificações em três arquivos diferentes:
build.gradle
A biblioteca android-browser-helper foi atualizada para oferecer suporte ao alvo de compartilhamento da Web. Como primeira etapa, atualize o aplicativo para usar uma versão mais recente ou igual à 2.0.1.
dependencies {
...
implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0'
}
res/strings.xml
O aplicativo precisa informar à Atividade na Web Confiável os detalhes do compartilhamento que ela permite receber, como quais URLs serão abertos, o método a ser usado e os tipos MIME compatíveis.
Isso é feito por meio de um JSON, disponibilizado para a Atividade confiável na Web com um recurso de string. Os
campos são os mesmos que o campo share_target
disponível no manifesto da Web e podem ser adicionados a
uma string dentro de strings.xml
, quase no estado em que se encontra, com duas observações importantes:
- O valor do atributo action precisa ser o URL completo, incluindo a origem.
- Aspas duplas precisam ter escape, para que cada
"
se torne\"
.
A seção share_target
de https://scrapbook-pwa.web.app/manifest.json tem esta aparência:
{
...
"share_target": {
"action": "/_share-target",
"enctype": "multipart/form-data",
"method": "POST",
"params": {
"files": [{
"name": "media",
"accept": [
"audio/*",
"image/*",
"video/*"
]
}]
}
},
...
}
O novo elemento de string ficará assim:
<string name="share_target">
{
\"action\": \"https://twa-web-scrapbook.web.app/_share-target\",
\"method\": \"POST\",
\"enctype\": \"multipart/form-data\",
\"params\": {
\"files\": [{
\"name\": \"media\",
\"accept\": [\"image/*\", \"audio/*\", \"video/*\"]
}]
}
}
</string>
AndroidManifest.xml
Algumas mudanças são necessárias no manifesto do Android. Primeiro, precisamos garantir que a
DelegationService
seja declarada, exportada e ativada.
Os desenvolvedores que criaram o app com base na demonstração básica já têm o serviço incluído, e a marcação precisa estar dentro da tag do aplicativo e ter esta aparência:
<service
android:name="com.google.androidbrowserhelper.trusted.DelegationService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
Por fim, dois novos itens precisam ser adicionados à tag de atividade da LauncherActivity:
- Uma tag meta-data
que faz referência ao JSON definido em strings.xml.
- Uma intent-filter
que declara quais tipos MIME o aplicativo pode processar para outros
apps no dispositivo.
<meta-data
android:name="android.support.customtabs.trusted.METADATA_SHARE_TARGET"
android:resource="@string/share_target"/>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="audio/*" />
<data android:mimeType="image/*" />
<data android:mimeType="video/*" />
</intent-filter>
Como pode ser visto na marcação acima, um elemento data
precisa ser adicionado para cada mime-type
declarada
no JSON share_target
.
Conclusão
A integração de destino de compartilhamento da Web permite que os PWAs dentro de uma atividade confiável na Web sejam mais profundamente integrados a outros apps instalados em um dispositivo Android.
Conforme descrito nas etapas acima, a marcação adicional necessária para adicionar suporte à API em um app Android existente que usa a Atividade confiável na Web foi simplificada pelo android-browser-helper.
Confira o artigo sobre destino de compartilhamento da Web para saber mais sobre como usar a API em um PWA e a API Web Share para saber como compartilhar conteúdo do Progressive Web App.
Solução de problemas
Meu aplicativo não aparece como uma opção quando tento compartilhar um arquivo de outro aplicativo.
Quando o aplicativo não aparece como uma opção, isso indica que intent-filter
está
incorreto. Verifique se a marcação intent-filter
contém as ações,
a categoria e os mime-types
corretos processados pelo aplicativo.
Meu app aparece como uma opção: o PWA é iniciado, mas os dados não são compartilhados.
Há algumas coisas que podem causar isso. Confira a seguir uma lista de verificação:
- Verifique se a validação do Digital Asset Links foi bem-sucedida.
- Verifique se o JSON em strings.xml está correto.