惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
爱范儿
爱范儿
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
宝玉的分享
宝玉的分享
Jina AI
Jina AI
B
Blog
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
aimingoo的专栏
aimingoo的专栏
腾讯CDC
C
Check Point Blog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - Franky
罗磊的独立博客
B
Blog RSS Feed
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 叶小钗
M
MIT News - Artificial intelligence
GbyAI
GbyAI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Do Domínio ao Deploy: Hospedando Arquivos de Deep Links n...
Cristian Dor · 2026-05-25 · via DEV Community

Cristian Dornelles

Neste artigo você vai aprender:

  • Por que Cloudflare Pages é a melhor opção para hospedar arquivos de verificação de deep links.
  • Como registrar um domínio .dev e o que o torna especial para este caso.
  • Como estruturar o projeto e configurar o _headers para controlar o Content-Type.
  • Como validar que tudo está acessível antes de testar no device.

Este é um conteúdo extra da série completa sobre Deep Links no Flutter. Se você ainda não viu os posts anteriores: Post 1 | Post 2 | Post 3 | Post 4 | Post 5 | Post 6 | Post 7.


Nos posts anteriores configuramos App Links e Universal Links (Post 5) e criamos a página signup.html que serve de ponte entre o link e a loja (Post 7). Faltava um lugar para hospedar tudo isso. Este é esse post.

Por que Cloudflare Pages

Três requisitos técnicos não negociáveis para hospedar assetlinks.json e apple-app-site-association:

  • HTTPS sem redirects — o Android rejeita o assetlinks.json se houver qualquer redirect no caminho.
  • Content-Type controlável — o apple-app-site-association não tem extensão, então o servidor precisa saber qual MIME type servir.
  • Domínio customizado — os arquivos precisam estar no mesmo domínio declarado no app.

O Cloudflare Pages atende os três com configuração mínima. Deploy direto do GitHub — push = publicado automaticamente.

Por que .dev

O TLD .dev está na lista HSTS Preload do Chrome. Isso significa que HTTPS é obrigatório por especificação — qualquer requisição HTTP é forçada para HTTPS pelo próprio navegador antes de chegar ao servidor. Uma configuração a menos para se preocupar.

Custo médio: R$ 60–80 por ano. Se você já usa Cloudflare, registrar o domínio lá elimina a etapa de apontar os nameservers.

Estrutura do projeto

Crie um repositório no GitHub com esta estrutura:

meudominio/
├── .well-known/
│   ├── assetlinks.json
│   └── apple-app-site-association
├── signup.html
├── index.html
└── _headers

Enter fullscreen mode Exit fullscreen mode

O signup.html é exatamente o arquivo que construímos no Post 7 — copie direto para cá.

O arquivo _headers

/.well-known/apple-app-site-association
  Content-Type: application/json

/.well-known/assetlinks.json
  Content-Type: application/json

Enter fullscreen mode Exit fullscreen mode

Sem esse arquivo, o apple-app-site-association (sem extensão) seria servido sem Content-Type definido — e o iOS pode rejeitar o arquivo silenciosamente. É a causa mais comum de Universal Links que "funcionam às vezes".

Os arquivos de verificação

assetlinks.json:

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.seuapp",
      "sha256_cert_fingerprints": [
        "AA:BB:CC:DD:EE:FF:..."
      ]
    }
  }
]

Enter fullscreen mode Exit fullscreen mode

apple-app-site-association:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAM_ID.com.seuapp",
        "paths": ["/signup", "/signup/*"]
      }
    ]
  }
}

Enter fullscreen mode Exit fullscreen mode

Deploy no Cloudflare Pages

1. Crie o repositório no GitHub com a estrutura acima e faça o push.

2. No Cloudflare: Workers & Pages → Create → Pages → Connect to Git → selecione o repositório → Build command: vazio → Output directory: / → Save and Deploy.

3. Em Custom Domains, adicione seu domínio. Se está no Cloudflare Registrar, o certificado é provisionado em minutos.

Validando o deploy

curl -I https://seudominio.dev/.well-known/assetlinks.json
curl -I https://seudominio.dev/.well-known/apple-app-site-association

Enter fullscreen mode Exit fullscreen mode

Confirme content-type: application/json nos dois. Se não aparecer, revise o arquivo _headers — espaçamento ou encoding incorreto são as causas mais comuns.

Para o Android, valide com a ferramenta oficial:

https://developers.google.com/digital-asset-links/tools/generator

Enter fullscreen mode Exit fullscreen mode

O que construímos até aqui

  • Um domínio .dev com HTTPS obrigatório por especificação.
  • Um repositório estático no GitHub com os arquivos de verificação e o signup.html.
  • Deploy automatizado no Cloudflare Pages — push = publicado.
  • Content-Type: application/json configurado corretamente para os dois arquivos de verificação.

Código completo disponível no repositório: FitConnect no GitHub

Este artigo é um crosspost do Medium — leia lá também e deixa um clap se curtiu.

Você usa outro provedor para hospedar esses arquivos? Vercel, Firebase, S3? Conta nos comentários.