Arquitetura do Fluxo de Match de Notificações

Ecossistema: React Native (Expo SDK) + Firebase Firestore + Node.js (Expo Push API / FCM)

1
Captura do Token no App
Expo Mobile

Ao abrir o app ou autenticar, o dispositivo solicita permissão e gera o token de Push ativo.

// notificationService.js
import * as Notifications from 'expo-notifications';

export async function getPushToken() {
  const { status } = await Notifications.requestPermissionsAsync();
  if (status !== 'granted') return null;

  // Suporta Expo Go e Builds Nativas
  const tokenData = await Notifications.getExpoPushTokenAsync({
    projectId: 'SEU_EXPO_PROJECT_ID'
  });
  return tokenData.data; // ExponentPushToken[...]
}
2
O Vinculamento (Match)
Firestore BD

O token obtido é gravado no documento único do usuário logado na coleção users.

// AuthContext.js (No Login)
import { doc, setDoc } from 'firebase/firestore';

async function bindUserToken(userId, pushToken) {
  const userRef = doc(db, 'users', userId);
  await setDoc(userRef, {
    pushToken: pushToken,
    updatedAt: new Date().toISOString()
  }, { merge: true });
}
3
Consulta & Disparo
Backend Node.js

O servidor recupera o token via userId, grava o histórico no banco e despacha o Push.

// server.js
async function sendNotification(userId, title, body) {
  // 1. Busca Token
  const userDoc = await db.collection('users').doc(userId).get();
  const token = userDoc.data()?.pushToken;

  // 2. Salva Histórico no Firestore
  const notifRef = await db.collection('notifications').add({
    userId, title, body, read: false, createdAt: new Date()
  });

  // 3. Envia para API Expo (Bridge para FCM/APNs)
  await fetch('https://exp.host/--/api/v2/push/send', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ to: token, title, body })
  });
}

Comparativo de Protocolos de Token

Tipo de Token
Compatibilidade Expo Go
Complexidade no Backend
Uso Recomendado
Expo Push Token
✅ 100% Compatível
Baixa (Apenas HTTP POST simples)
Desenvolvimento rápido e prototipagem
FCM Direct Token
❌ Incompatível (Requer Build)
Média (Requer SDK firebase-admin)
Produção e Builds Nativas finais

Sugestões de Arquitetura & Produção

1. Limpeza no Logout

Sempre defina pushToken: null no Firestore ao deslogar para impedir que o próximo usuário do aparelho receba dados confidenciais.

2. Múltiplos Dispositivos

Para permitir notificações simultâneas (ex: celular e tablet), substitua o campo por uma lista de tokens: pushTokens: [...].

3. Rotação de Tokens

Adicione um listener addPushTokenListener no app para atualizar a base de dados caso o sistema operacional renove o token nativo.

4. Política de Exclusão

Crie uma Cloud Function com disparo cronológico para apagar registros de notificações com mais de 30 dias, mantendo o custo do Firestore zerado.