Android App Links
Filtros de Intent, assetlinks.json e links verificados - o guia do Android para abrir URLs https:// diretamente no seu app Expo SDK 57 sem a folha de desambiguação "Abrir com".
Busque em todas as páginas da documentação
Filtros de Intent, assetlinks.json e links verificados - o guia do Android para abrir URLs https:// diretamente no seu app Expo SDK 57 sem a folha de desambiguação "Abrir com".
Cartão de receita de referência rápida - pronto para copiar e colar.
// app.config.ts
export default {
expo: {
android: {
package: "com.example.shopapp",
intentFilters: [
{
action: "VIEW",
autoVerify: true,
data: [
{
scheme: "https",
host: "shop.example.com",
pathPrefix: "/orders",
},
],
category: ["BROWSABLE", "DEFAULT"],
},
],
},
},
};// https://shop.example.com/.well-known/assetlinks.json
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.shopapp",
"sha256_cert_fingerprints": [
"14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:10:D4:4A:8F:D8:00:6F:8F:95:34:E7:6B:58"
]
}
}
]Quando usar isso:
assetlinks.json ao lado dele.https://shop.example.com/....Configuração completa de verificação para https://shop.example.com/orders/*.
Passo 1 - Filtros de Intent em app.config.ts
// app.config.ts
import type { ExpoConfig } from "expo/config";
const config: ExpoConfig = {
name: "ShopApp",
slug: "shop-app",
scheme: "shopapp",
android: {
package: "com.example.shopapp",
intentFilters: [
{
action: "VIEW",
autoVerify: true,
data: [
{
scheme: "https",
host: "shop.example.com",
pathPrefix: "/orders",
},
{
scheme: "https",
host: "shop.example.com",
pathPrefix: "/product",
},
],
category: ["BROWSABLE", "DEFAULT"],
},
],
},
ios: {
bundleIdentifier: "com.example.shopapp",
associatedDomains: ["applinks:shop.example.com"],
},
};
export default config;Passo 2 - Hospede assetlinks.json
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.shopapp",
"sha256_cert_fingerprints": [
"AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
]
}
}
]Sirva em: https://shop.example.com/.well-known/assetlinks.json
Passo 3 - Obtenha a impressão digital SHA-256
# Play Console → Integridade do App → Certificado da chave de assinatura do app → SHA-256
# Keystore de depuração local (apenas builds de desenvolvimento):
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass androidPasso 4 - Construa e teste
npx expo prebuild --platform android
npx expo run:android
adb shell am start -a android.intent.action.VIEW -d "https://shop.example.com/orders/42" com.example.shopappPasso 5 - Verifique o status da verificação
adb shell pm get-app-links com.example.shopappProcure por shop.example.com: verified - none ou legacy_failure significa que o host ou a impressão digital precisam ser corrigidos.
O que isso demonstra:
autoVerify: true dispara a verificação de domínio no momento da instalação.pathPrefix limita quais URLs o app reivindica.assetlinks.json para cada host nos filtros de intent com autoVerify.shopapp://) ignoram a verificação - ainda úteis para desenvolvimento e OAuth.| Campo | Propósito |
|---|---|
action: "VIEW" | Intent padrão para abrir URL |
category: ["BROWSABLE", "DEFAULT"] | Necessário para manipulação de links |
autoVerify: true | Habilita Digital Asset Links |
data.scheme | https para App Links |
data.host | Domínio sem caminho |
data.pathPrefix | Correspondência de prefixo de caminho de URL |
data.pathPattern | Caminho regex (escape com cuidado) |
| Status | Significado | Ação |
|---|---|---|
verified | Sucesso | Enviar |
none | Nenhuma tentativa / filtro ausente | Verificar manifesto |
legacy_failure | Impressão digital ou JSON incompatível | Corrigir assetlinks.json |
no_response | Servidor inacessível | Corrigir CDN / TLS |
# Reexecuta a verificação após corrigir assetlinks.json (Android 12+)
adb shell pm verify-app-links --re-verify com.example.shopappassetlinks.json quebram a verificação - sirva 200 na URL exata.application/json.android:launchMode na atividade principal afeta o back-stack - singleTask é comum para apps de deep-link.autoVerify: true ausente - o filtro funciona, mas exibe o seletor. Correção: defina autoVerify e reinstale o app.pathPrefix muito amplo - / reivindica o site inteiro, incluindo o blog. Correção: restrinja para /orders, /product.app.config.ts, mas executou um APK antigo. Correção: npx expo prebuild --clean e depois reconstrua.shopapp:// - App Links são apenas HTTPS. Correção: teste URLs https:// com o comando de intent adb.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Filtro de intent de esquema personalizado | OAuth, testes internos rápidos | Links de marketing públicos HTTPS |
Apenas esquema expo-linking | Protótipo antes da configuração do CDN | Campanhas de produção no Android |
| Branch / Firebase Dynamic Links | Atribuição adiada | Você controla o domínio e quer zero SDK |
| Seletor confiável pelo usuário (sem autoVerify) | Apps concorrentes compartilham domínio | Você quer abrir com um toque |
target com diferentes valores de package_name (por exemplo, sufixo .dev).pathPrefix: "/orders" corresponde a /orders, /orders/42, /orders/42/items.pathPattern usa regex - poderoso, mas fácil de escapar incorretamente; prefira prefixo quando possível.pm get-app-links.data do filtro de intent.pathPrefix.https - http não verificará automaticamente. Use HTTPS em todos os lugares.pm verify-app-links --re-verify após corrigir o JSON - sem cache de hora em hora no estilo Apple, mas o TTL da CDN se aplica.assetlinks.json e apple-app-site-association no mesmo domínio - veja Universal Links do iOS.Versões da Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026