Quando android:autoVerify="true" está presente em pelo menos um dos filtros de intent
do app, a instalação dele em um dispositivo com o Android 6.0 (nível 23 da API) ou
mais recente faz com que o sistema verifique automaticamente os hosts associados aos
URLs nos filtros de intent do app. No Android 12 e versões mais recentes, você
também pode invocar o processo de verificação manualmente para
testar a lógica de verificação.
Verificação automática
A verificação automática do sistema envolve o seguinte:
- O sistema inspeciona todos os filtros de intent que incluem qualquer um dos seguintes:
- Ação:
android.intent.action.VIEW - Categorias:
android.intent.category.BROWSABLEeandroid.intent.category.DEFAULT - Esquema de dados:
httpouhttps
- Ação:
- Para cada nome do host exclusivo encontrado nos filtros de intent, o Android consulta os sites correspondentes para o arquivo do Digital Asset Links em https://hostname/.well-known/assetlinks.json.
Depois de confirmar a lista de sites a serem associados ao app e verificar se o arquivo JSON hospedado é válido, instale o app no dispositivo. Aguarde pelo menos 20 segundos para que o processo de verificação assíncrona seja concluído. Use o comando abaixo para verificar se o sistema verificou seu app e definiu as políticas corretas de processamento de links:
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "http://domain.name:optional_port"
Verificação manual
A partir do Android 12, é possível invocar manualmente a verificação de domínio para um app instalado em um dispositivo. É possível realizar esse processo sendo o app direcionado ao Android 12 ou não.
Estabelecer uma conexão com a Internet
Para realizar a verificação de domínio, o dispositivo de teste precisa estar conectado à Internet.
Oferecer compatibilidade com o processo de verificação de domínio atualizado
Se o app for direcionado ao Android 12 ou versões mais recentes, o sistema vai usar o processo de verificação de domínio atualizado automaticamente.
Caso contrário, é possível ativar manualmente o processo de verificação atualizado. Para fazer isso, execute o seguinte comando em uma janela do terminal:
adb shell am compat enable 175408749 PACKAGE_NAME
Redefinir o estado de Links do app Android em um dispositivo
Antes de invocar manualmente a verificação de domínio em um dispositivo, você precisa redefinir o estado de Links do app Android no dispositivo de teste. Para fazer isso, execute o comando abaixo em uma janela do terminal:
adb shell pm set-app-links --package PACKAGE_NAME 0 all
Esse comando coloca o dispositivo no mesmo estado em que estava antes do usuário escolher apps padrão para qualquer domínio.
Invocar o processo de verificação do domínio
Depois de redefinir o estado de Links do app Android em um dispositivo, você poderá fazer a verificação por conta própria. Para fazer isso, execute o comando abaixo em uma janela do terminal:
adb shell pm verify-app-links --re-verify PACKAGE_NAME
Analisar os resultados da verificação
Após aguardar um tempo para que o agente de verificação conclua as solicitações, analise os resultados. Para isso, execute o comando a seguir:
adb shell pm get-app-links PACKAGE_NAME
A saída deste comando será parecida com esta:
com.example.pkg:
ID: 01234567-89ab-cdef-0123-456789abcdef
Signatures: [***]
Domain verification state:
example.com: verified
sub.example.com: legacy_failure
example.net: verified
example.org: 1026
Os domínios aprovados na verificação têm um estado de verificação de domínio
verified (verificado). Qualquer outro estado indica que não foi possível realizar a verificação
de domínio. Especificamente, o estado none (nenhum) indica que talvez o agente
de verificação ainda não tenha concluído o processo.
A lista a seguir mostra os possíveis valores que a verificação pode retornar para um domínio:
none- Nada foi registrado para este domínio. Aguarde mais alguns minutos para que o agente de verificação conclua as solicitações relacionadas à verificação de domínio e, em seguida, invoque o processo de verificação de domínio novamente.
verified- O domínio foi verificado para o app de declaração.
approved- O domínio foi aprovado de maneira forçada, geralmente pela execução de um comando do shell.
denied- O domínio foi negado de maneira forçada, geralmente pela execução de um comando do shell.
migrated- O sistema manteve o resultado de um processo anterior que usava a verificação de domínio legada.
restored- O domínio foi aprovado após a restauração de dados do usuário. Presume-se que o domínio foi verificado anteriormente.
legacy_failure- O domínio foi rejeitado por um verificador legado. O motivo específico da falha é desconhecido.
system_configured- O domínio foi aprovado automaticamente pelo configurador do dispositivo.
- Código do erro
1024ou maior Código do erro personalizado específico para o verificador do dispositivo.
Confira se você estabeleceu uma conexão de rede e invoque o processo de verificação de domínio novamente.
Solicitar ao usuário para associar o app a um domínio
Outra maneira de aprovar o app para um domínio é pedir ao usuário para associá-lo a esse domínio.
Conferir se o app já foi aprovado para o domínio
Antes de solicitar ao usuário, confira se o app é o gerenciador padrão dos
domínios definidos nos elementos <intent-filter>. Consulte o estado
da aprovação usando um dos métodos a seguir:
- A API
DomainVerificationManager(durante a execução). - Um programa de linha de comando (durante o teste).
DomainVerificationManager
O snippet de código a seguir demonstra como usar a API
DomainVerificationManager:
Kotlin
val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)
// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }
// Domains that haven't passed Android App Links verification but that the
// user has associated with an app.
val selectedDomains = userState?.hostToStateMap
?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }
// All other domains.
val unapprovedDomains = userState?.hostToStateMap
?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }
Java
Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
manager.getDomainVerificationUserState(context.getPackageName());
Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
Integer stateValue = hostToStateMap.get(key);
if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
// Domain has passed Android App Links verification.
verifiedDomains.add(key);
} else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
// Domain hasn't passed Android App Links verification, but the user
// has associated it with an app.
selectedDomains.add(key);
} else {
// All other domains.
unapprovedDomains.add(key);
}
}
Programa de linha de comando
Quando testar o app durante o desenvolvimento, você pode executar o comando a seguir para consultar o estado da verificação dos domínios da sua organização:
adb shell pm get-app-links --user cur PACKAGE_NAME
Na saída de exemplo a seguir, mesmo que o app tenha falhado na verificação para o domínio "example.org", o usuário 0 aprovou manualmente o app nas configurações do sistema e nenhum outro pacote foi verificado para esse domínio.
com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
example.com: verified
example.net: verified
example.org: 1026
User 0:
Verification link handling allowed: true
Selection state:
Enabled:
example.org
Disabled:
example.com
example.net
Também é possível usar comandos do shell para simular o processo em que o usuário seleciona
qual app está associado a um determinado domínio. Uma explicação completa desses
comandos está disponível na saída de adb shell pm.
Fornecer contexto para a solicitação
Antes de fazer essa solicitação de aprovação de domínio, forneça um contexto para o usuário. Por exemplo, você pode mostrar uma tela de apresentação, uma caixa de diálogo ou um elemento de IU parecido que explique ao usuário por que o app precisa ser o gerenciador padrão de um determinado domínio.
Fazer a solicitação
Após o usuário entender o que o app está pedindo, faça a solicitação.
Para fazer isso, invoque uma intent que inclua a
ação da intenet
ACTION_APP_OPEN_BY_DEFAULT_SETTINGS e uma string de dados correspondente a
package:com.example.pkg para o app de destino, conforme mostrado no
snippet de código a seguir:
Kotlin
val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
Uri.parse("package:${context.packageName}"))
context.startActivity(intent)
Java
Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
Quando a intent for invocada, os usuários verão uma tela de configurações chamada Abrir por padrão. Essa tela contém um botão de opção chamado Abrir links compatíveis, conforme mostrado na Figura 1.
Quando o usuário ativa a opção Abrir links compatíveis, um conjunto de caixas de seleção aparece em uma seção chamada Links para abrir neste app. Nela, os usuários podem selecionar os domínios que querem associar ao app. Eles também podem selecionar Adicionar link para adicionar domínios, como mostrado na Figura 2. Mais tarde, quando os usuários selecionarem um link nos domínios adicionados, ele será aberto automaticamente no app.
Domínios abertos no app que não podem ser verificados por ele
A função principal do app pode ser a de abrir links como um terceiro, sem a capacidade de verificar os domínios processados. Se esse for o caso, explique aos usuários que, ao selecionar um link da Web, eles não poderão escolher entre um app primário e seu app (de terceiros). Os usuários precisam associar manualmente os domínios ao app de terceiros.
Além disso, considere apresentar uma caixa de diálogo ou atividade trampolim, que possibilite que o usuário abra o link no app primário, se ele preferir, agindo como um proxy. Antes de configurar essa atividade de caixa de diálogo ou trampolim, configure seu app para que ele tenha a visibilidade de pacote nos apps primários correspondentes ao filtro de intent da Web do app.
Latência de atualização do Digital Asset Links
Quando você atualiza o arquivo assetlinks.json no servidor da Web, o tempo necessário
para que essas mudanças sejam refletidas nos dispositivos dos usuários finais depende da versão do SO:
- Android 15 (nível 35 da API) e versões mais recentes:o sistema verifica novamente os domínios em segundo plano de forma periódica. As mudanças podem levar até sete dias para serem propagadas para todos os dispositivos do usuário final devido ao armazenamento em cache do sistema e à reverificação programada.
- Android 14 (nível 34 da API) e versões anteriores:o sistema não realiza reverificações periódicas em segundo plano. As atualizações do arquivo geralmente são captadas apenas quando o app é instalado ou atualizado.
Como testar atualizações
Para forçar uma nova verificação em um dispositivo específico durante o teste, desinstale e reinstale o app. No entanto, os caches do lado do servidor ainda podem
atrasar a entrega do arquivo assetlinks.json atualizado para o dispositivo,
mesmo após a reinstalação. Como o cache é baseado em tempo, o atraso geralmente
é resolvido automaticamente se você tentar de novo depois de algumas horas.