Aller au contenu principal
Tutoriel

Notifications push Ionic Capacitor avec Firebase : guide étape par étape

Apprenez à intégrer les notifications push dans votre application Ionic Capacitor avec Firebase, grâce à un guide étape par étape pour Android et iOS.

Notifications push Ionic Capacitor avec Firebase : guide étape par étape

Dans ce tutoriel, nous allons intégrer les notifications push dans une application Ionic Capacitor en utilisant Firebase. Pour un plugin Capacitor maintenu avec le support de Firebase Cloud Messaging, consultez @capgo/capacitor-firebase-messaging. Vous n'avez pas besoin d'un service spécifique pour cela, mais vous devrez configurer plusieurs éléments au préalable. Firebase est un excellent choix puisqu'il est requis pour Android, et vous pouvez l'utiliser facilement pour envoyer des notifications sans passer par la base de données.

Tout d'abord, nous allons créer une application Ionic avec Capacitor activé et spécifier notre ID du package, qui est l'identifiant unique de votre application. Ensuite, nous allons compiler l'app et ajouter les plateformes natives.

ionic start pushApp blank --type=angular --capacitor --package-id=com.appdactic.devpush
cd ./pushApp
ionic build
npx cap add ios
npx cap add android

Si vous avez déjà une application, vous pouvez modifier le capacitor.config.json pour inclure votre appId. Cependant, si vos dossiers natifs existent déjà, vous devrez remplacer l'id dans tous les fichiers concernés, car Capacitor ne crée le dossier qu'une seule fois et ne mettra pas l'id à jour lui-même. Dans le capacitor.config.json, vous pouvez aussi spécifier des options comme la mise à jour du badge, le son lors d'un push ou l'affichage d'une alerte à la réception d'une notification.

{
  "appId": "com.appdactic.devpush",
  "appName": "pushApp",
  "bundledWebRuntime": false,
  "npmClient": "npm",
  "webDir": "www",
  "plugins": {
    "SplashScreen": {
      "launchShowDuration": 0
    },
    "PushNotifications": {
      "presentationOptions": ["badge", "sound", "alert"]
    }
  },
  "cordova": {}
}

Configurons maintenant les notifications push en dehors de l'app.

Configuration Firebase

Commencez par créer un nouveau projet Firebase ou utilisez un projet existant. Indiquez un nom et les options par défaut pour un nouveau projet.

Si vous avez une nouvelle app, vous devriez voir « Commencez par ajouter Firebase à votre app » dans le dashboard de votre app. Sinon, cliquez sur l'icône d'engrenage et allez dans paramètres du projet pour ajouter une app.

La boîte de dialogue est similaire pour iOS et Android ; l'essentiel est d'utiliser votre ID de package pour les apps.

configuration-firebase-app-ios

Après l'étape initiale, téléchargez les fichiers suivants :

  • google-services.json fichier pour Android
  • GoogleService-info.plist fichier pour iOS

Ensuite, configurez les plateformes.

Préparation des notifications push Android

Pour Android, déplacez le google-services.json fichier téléchargé vers le android/app/ dossier.

android-push-file

C'est tout pour Android. Configurons maintenant iOS.

Préparation des notifications push iOS

Cette étape est un peu plus complexe. D'abord, créez un App ID pour votre application dans la liste des identifiants de votre compte Apple Developer. Assurez-vous de sélectionner la capacité Push Notifications dans la liste.

ionic-ios-push-id

Le ID du bundle doit être identique à votre App ID dans Capacitor et Firebase.

Maintenant, créez une clé et activez le service Apple Push Notifications (APNs). Si vous avez atteint le nombre maximum de clés, vous pouvez utiliser une clé existante ou un certificat, mais le processus est plus complexe.

ios-developer-push-key

Après avoir téléchargé le fichier .p8 , envoyez-le sur Firebase. Ouvrez Cloud Messaging onglet de vos paramètres de projet Firebase, envoyez le fichier, puis saisissez les détails de l'ID de clé et de votre Team ID iOS.

firebase-upload-ios-key

Maintenant, modifiez votre projet Xcode en exécutant :

npx cap open ios

Copier le GoogleService-Info.plist fichier téléchargé depuis Firebase dans votre projet iOS. Faites glisser le fichier dans le dossier app/app du projet Xcode, et sélectionnez Copier les éléments si nécessaire.

Ensuite, ajoutez un nouveau Pod pour la dépendance Firebase dans le ios/App/Podfile:

target 'App' do
  capacitor_pods
  # Add your Pods here
  pod 'Firebase/Messaging'
end

Mettez à jour la plateforme native avec cette commande :

npx cap update ios

Modifiez le code Swift natif dans ios/App/App/AppDelegate.swift pour s'enregistrer auprès de Firebase et renvoyer le token correct à votre application.

import UIKit
import Capacitor
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    return true
  }

  // All the existing functions
  // ...

  // Update this one:
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
        InstanceID.instanceID().instanceID { (result, error) in
            if let error = error {
                NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidFailToRegisterForRemoteNotificationsWithError.name()), object: error)
            } else if let result = result {
                NotificationCenter.default.post(name: Notification.Name(CAPNotifications.DidRegisterForRemoteNotificationsWithDeviceToken.name()), object: result.token)
            }
        }
    }
}

Enfin, ajoutez la Capability Push Notifications dans votre projet Xcode.

capacitor-xcode-capability

Maintenant, compilez votre application et intégrez les push notifications.

Intégration des push notifications avec Ionic

Créez un service et une nouvelle page dans votre projet Ionic :

ionic g service services/fcm
ionic g page pages/details

Mettez à jour le routage dans app/app-routing.module.ts pour inclure la nouvelle page avec un id dynamique :

import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  {
    path: 'home',
    loadChildren: () => import('./home/home.module').then( m => m.HomePageModule)
  },
  {
    path: '',
    redirectTo: 'home',
    pathMatch: 'full'
  },
  {
    path: 'home/:id',
    loadChildren: () => import('./pages/details/details.module').then( m => m.DetailsPageModule)
  },
];

@NgModule({
  imports: [
    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Créez un service pour gérer les push notifications dans services/fcm.service.ts:

import { Injectable } from '@angular/core';
import {
  Plugins,
  PushNotification,
  PushNotificationToken,
  PushNotificationActionPerformed,
  Capacitor
} from '@capacitor/core';
import { Router } from '@angular/router';

const { PushNotifications } = Plugins;

@Injectable({
  providedIn: 'root'
})
export class FcmService {

  constructor(private router: Router) { }

  initPush() {
    if (Capacitor.platform !== 'web') {
      this.registerPush();
    }
  }

  private registerPush() {
    PushNotifications.requestPermission().then((permission) => {
      if (permission.granted) {
        // Register with Apple / Google to receive push via APNS/FCM
        PushNotifications.register();
      } else {
        // No permission for push granted
      }
    });

    PushNotifications.addListener(
      'registration',
      (token: PushNotificationToken) => {
        console.log('My token: ' + JSON.stringify(token));
      }
    );

    PushNotifications.addListener('registrationError', (error: any) => {
      console.log('Error: ' + JSON.stringify(error));
    });

    PushNotifications.addListener(
      'pushNotificationReceived',
      async (notification: PushNotification) => {
        console.log('Push received: ' + JSON.stringify(notification));
      }
    );

    PushNotifications.addListener(
      'pushNotificationActionPerformed',
      async (notification: PushNotificationActionPerformed) => {
        const data = notification.notification.data;
        console.log('Action performed: ' + JSON.stringify(notification.notification));
        if (data.detailsId) {
          this.router.navigateByUrl(`/home/${data.detailsId}`);
        }
      }
    );
  }
}

Appelez le initPush() fonction dans app/app.component.ts:

import { Component } from '@angular/core';

import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { FcmService } from './services/fcm.service';

@Component({
  selector: 'app-root',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.scss']
})
export class AppComponent {
  constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private fcmService: FcmService
  ) {
    this.initializeApp();
  }

  initializeApp() {
    this.platform.ready().then(() => {
      this.statusBar.styleDefault();
      this.splashScreen.hide();

      // Trigger the push setup
      this.fcmService.initPush();
    });
  }
}

Gérez les informations sur la page de détails dans pages/details/details.page.ts:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Plugins } from '@capacitor/core';
const { PushNotifications } = Plugins;

@Component({
  selector: 'app-details',
  templateUrl: './details.page.html',
  styleUrls: ['./details.page.scss'],
})
export class DetailsPage implements OnInit {
  id = null;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.paramMap.subscribe(params => {
      this.id = params.get('id');
    });
  }

  resetBadgeCount() {
    PushNotifications.removeAllDeliveredNotifications();
  }

}

Affichez les détails dans pages/details/details.page.html:

<ion-header>
  <ion-toolbar>
    <ion-buttons slot="start">
      <ion-back-button defaultHref="/"></ion-back-button>
    </ion-buttons>
    <ion-title>Details</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
  My Id from push: {{ id }}

  <ion-button (click)="resetBadgeCount()" expand="block">
    Reset Badge Count
  </ion-button>
</ion-content>

Compilez l'app, synchronisez vos changements et déployez-la sur votre appareil.

ionic build
npx cap sync

Maintenant, vous pouvez envoyer des notifications push avec Firebase.

Envoyer des notifications push avec Firebase

Il existe plusieurs façons d'envoyer des notifications push avec Firebase.

Test sur un appareil spécifique

Après avoir déployé votre app sur un appareil, vous pouvez consulter les logs de la console pour voir le token après l'enregistrement. Utilisez ce token pour envoyer un test de notification push ciblé afin de confirmer que votre intégration fonctionne. Dans Firebase, allez dans Cloud Messaging et sélectionnez Envoyer un message de test. Ajoutez le token de l'appareil depuis les logs.

firebase-test-push

Si tout est configuré correctement, vous devriez recevoir une notification push sur votre appareil.

Message push avec payload

Pour tester une notification push avec des informations supplémentaires, suivez l'assistant sur la même page pour spécifier les informations générales et choisir la plateforme cible. Ajoutez des options supplémentaires pour envoyer un payload avec votre notification push.

firebase-push-payload

Dans le Options avancées section, ajoutez un Custom data paire clé-valeur. Par exemple, vous pouvez utiliser la clé detailsId et une valeur de votre choix. Ces données seront utilisées dans l'app pour naviguer vers la page de détails avec l'id spécifié.

Après l'envoi de la notification push, votre app doit la recevoir et afficher la page de détails avec l'id spécifié lorsque la notification est tapée.

En utilisant Firebase API

Vous pouvez aussi envoyer des notifications push par programmation via l’API de Firebase. Pour ce faire, vous devez obtenir la Clé serveur depuis les paramètres de votre projet Firebase sous Cloud Messaging .

Avec la clé serveur, vous pouvez envoyer une requête POST à l'API Firebase avec le payload requis. Voici un exemple utilisant Node.js et la request bibliothèque :

const request = require('request');

const serverKey = 'YOUR_SERVER_KEY';
const deviceToken = 'YOUR_DEVICE_TOKEN';

const options = {
  method: 'POST',
  url: 'https://fcm.googleapis.com/fcm/send',
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'key=' + serverKey
  },
  body: JSON.stringify({
    to: deviceToken,
    notification: {
      title: 'Test Push',
      body: 'This is a test push notification with custom data'
    },
    data: {
      detailsId: '123'
    }
  })
};

request(options, (error, response, body) => {
  if (error) {
    console.error('Error sending push:', error);
  } else {
    console.log('Push sent successfully:', body);
  }
});

Remplacer YOUR_SERVER_KEY et YOUR_DEVICE_TOKEN avec votre clé serveur et votre token d'appareil réels. Exécutez le script, et votre appareil devrait recevoir la notification push avec le payload personnalisé.

Et voilà ! Vous avez intégré avec succès les notifications push dans votre application Ionic Capacitor via Firebase. Vous pouvez désormais envoyer des notifications push à vos utilisateurs sur Android et iOS.

Allez plus loin avec les notifications push Ionic Capacitor et Firebase : un guide étape par étape

Si vous utilisez Notifications push Ionic Capacitor avec Firebase : guide étape par étape pour planifier la migration et les opérations d'entreprise, connectez-l’à Capgo Enterprise pour le workflow produit dans Capgo Enterprise, Alternatives aux plugins Ionic Enterprise pour le workflow produit dans les alternatives aux plugins Ionic Enterprise, Alternatives à Capgo pour le workflow produit dans les alternatives à Capgo Consulting Capgo pour le workflow produit dans le Consulting Capgo, et Capgo Support Premium pour le workflow produit dans Capgo Premium Support.

Live updates pour les apps Capacitor

Quand un bug de la couche web est en production, déployez le correctif via Capgo au lieu d'attendre des jours l'approbation des stores. Les utilisateurs reçoivent la mise à jour en arrière-plan, tandis que les changements natifs suivent le circuit de validation habituel.

Les derniers articles du blog

Capgo vous apporte les meilleures informations pour créer une application mobile vraiment professionnelle.