FCM (push Android et web)

Firebase Cloud Messaging porte les push Android et le web push. Comme pour APNs, Appwin envoie avec tes identifiants.

Appwin utilise l'API FCM v1, celle qui s'authentifie par compte de service. Les anciennes clés serveur de l'API legacy (AAAA…) ne fonctionnent pas - Google les a retirées.

1. Project ID et compte de service

Dans la console Firebase, sur ton projet. Vérifie au passage que Cloud Messaging (API V1) est activé.

  1. 1

    Relève l'ID du projet

    Roue crantée → Paramètres du projet → onglet Général → « ID du projet », de la forme mon-app-1a2b3.

    C'est l'identifiant technique, pas le nom d'affichage. Les deux se ressemblent souvent, et se confondre donne un 404 sur tous les envois.

    ID du projet Firebase dans Paramètres → Général.

  2. 2

    Ouvre Comptes de service

    Paramètres du projet → onglet Comptes de service.

    Onglet Comptes de service dans Firebase.

  3. 3

    Génère la clé privée

    Générer une nouvelle clé privée → confirme. Le JSON se télécharge.

    Génération d'une clé privée de compte de service Firebase.

    Le JSON ne se retélécharge pas. Perdu, on en génère un nouveau et on supprime l'ancien depuis Google Cloud.

  4. 4

    Importe dans Appwin

    Réglages → Projets → ton app → Intégrations → Firebase Cloud Messaging.

    ChampValeur
    Firebase Project IDmon-app-1a2b3
    Service Account JSONLe contenu entier du fichier

    Passe par Importer un fichier plutôt que par un copier-coller : le JSON contient une clé privée avec des \n échappés, qu'un presse-papiers abîme facilement.

    Import du JSON de compte de service dans Appwin.

2. Enregistrer le jeton de l'appareil

Chaque appareil déclare son jeton FCM après avoir obtenu l'autorisation.

dart
final token = await FirebaseMessaging.instance.getToken();
if (token != null) {
  await AppwinCore.instance.registerPushToken(
    token: token,
    platform: 'android',
    pushOptIn: true,
  );
}

FCM peut faire tourner un jeton à tout moment. Rebranche l'enregistrement sur onTokenRefresh, sinon l'appareil devient injoignable sans prévenir :

dart
FirebaseMessaging.instance.onTokenRefresh.listen((token) {
  AppwinCore.instance.registerPushToken(
    token: token,
    platform: 'android',
  );
});

pushOptIn reflète le consentement de l'utilisateur. À repasser à false s'il retire son autorisation, plutôt que de cesser d'enregistrer le jeton : ça permet de distinguer « a refusé » de « n'a jamais été vu ».

Vérifier

Comme pour APNs, une clé absente fait simuler l'envoi côté API plutôt qu'échouer. Une campagne peut donc sembler partie sans que rien ne soit envoyé.

Contrôle les logs de l'API : un message not configured - simulating delivery indique que la clé manque.

Dépannage

SymptômeCause probable
Android muetAncienne clé serveur legacy au lieu d'un compte de service
404 sur tous les envoisNom d'affichage renseigné au lieu de l'ID du projet
UNREGISTEREDJeton périmé : l'app a été désinstallée, ou le refresh n'est pas branché
SENDER_ID_MISMATCHLe jeton vient d'un autre projet Firebase que celui configuré
JSON refuséFichier tronqué au copier-coller : utilise l'import
Rien ne part du toutClé absente : l'API simule et le dit dans ses logs

Suite