Une application PWA c’est génial mais on ne maitrise pas toujours bien quand elle se met à jour, si elle a détecté une mise à jour, etc. Aujourd’hui je vais vous montrer comment créer un service d’update qui vous donnera le squelette de base pour des gestion plus fine. Angular a tout ce qu’il faut pour ne pas s’embêter avec la gestion fine des workers.
Création d’un service de mise à jour
Nous allons créer un service avec la commande
ng generate
puis sélectionner service et nommer le services/update.
J’aime bien mettre tous mes services dans un répertoire services…
Programmation du service de mise à jour
Le fichier update.service.ts va ressembler au code fourni ci-dessous.
Plusieurs points sur ce code :
- Le composant central d’Angular est SwUpdate (sw pour Service Worker). C’est lui qui va faire le lien avec le Service Worker et vérifier s’il y a des fichiers mise à jour, etc.
- Il propose une property isEnabled si vous souhaitez logger si le service est disponible ou pas, en fonction des plate-formes.
- On peut déclarer tout le code de subscribeUpdate dans le constructeur de UpdateService mais je préfère l’appeler à la main.
- J’utilise Ionic comme framework graphique et donc un ToastController pour afficher les messages.
- Je ne donne pas le choix à la mise à jour. Ça peut poser problème en cas de mise à jour loupée… Il est très simple de rajouter sur le Toast des boutons pour continuer ou annuler ou une temporisation pour que le toast s’enlève au bout de quelques secondes.
- J’utilise window.location.reload(); pour recharger la page et donc l’application. Vous pouvez également utiliser un Router, etc. Pour des comportements plus fins, il faudra passer par la configuration du Service Worker.
import { Injectable } from '@angular/core'; import { SwUpdate } from '@angular/service-worker'; import { ToastController } from '@ionic/angular'; @Injectable({ providedIn: 'root' }) export class UpdateService { // Ref: https://angular.io/api/service-worker/SwUpdate // Ref: https://alligator.io/angular/service-worker-updates/ constructor( private swUpdate: SwUpdate, private toastController: ToastController ) { } subscribeUpdate() { this.swUpdate.available.subscribe(evt => { this.showUpdateToast(); }); } private async showUpdateToast() { const toast = await this.toastController.create({ message: 'Nouvelle version disponible. L\'application va se recharger.', position: 'middle', color: 'warning', buttons: [ { text: 'OK', handler: () => { window.location.reload(); } } ] }); toast.present(); } }
Appel du service
Pour utiliser ce service, il vous suffit de le déclarer dans le fichier désiré. Je vous conseille le app.component.ts pour le vérifier au lancement de l’application.
import { UpdateService } from './services/update.service';
puis de l’injecter (de faire injecter une instance…) dans le constructeur :
constructor( private platform: Platform, private updateService: UpdateService ) { this.initializeApp(); }
Et enfin de l’appeler au « lancement » de l’application :
ngOnInit() { this.updateService.subscribeUpdate(); }
Conclusion
Franchement, vous imaginiez ça plus compliqué, non ?
Amusez-vous bien avec les PWA !