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. Générer la clé de compte de service

Dans la console Firebase, sur ton projet :

  1. Roue crantée → Paramètres du projet
  2. Onglet Comptes de service
  3. Générer une nouvelle clé privée → confirme
  4. Le fichier JSON se télécharge

Vérifie au passage que Cloud Messaging (API V1) est activé pour le projet.

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

2. Relever le Project ID

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.

3. Renseigner 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.


4. 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