Étape 3: Ajoutez des alarmes et des notifications

Au cours de cette étape, vous allez découvrir:

  • Comment activer votre application à des intervalles spécifiés pour exécuter des tâches en arrière-plan
  • Comment utiliser les notifications à l'écran pour attirer l'attention sur quelque chose d'important.

Temps estimé pour terminer cette étape: 20 minutes. Pour prévisualiser ce que vous allez réaliser au cours de cette étape, accédez au bas de cette page ↓.

Améliorer votre application Todo avec des rappels

Améliorez l'application Todo en ajoutant une fonctionnalité permettant de rappeler à l'utilisateur s'il a des tâches ouvertes, même lorsque l'application est fermée.

Tout d'abord, vous devez ajouter un moyen pour l'application de vérifier régulièrement les tâches non terminées. Ensuite, l'application doit afficher un message, même si la fenêtre de l'application Todo est fermée. Pour ce faire, vous devez comprendre le fonctionnement des alarmes et des notifications dans les applications Chrome.

Ajouter des alarmes

Utilisez chrome.alarms pour définir un intervalle de réveil. Tant que Chrome est en cours d'exécution, l'écouteur d'alarmes est appelé à peu près à l'intervalle défini.

Mettre à jour les autorisations des applications

Dans le fichier manifest.json, demandez l'autorisation "alarms":

"permissions": ["storage", "alarms"],

Mettre à jour les scripts d'arrière-plan

Dans background.js, ajoutez un écouteur onAlarm. Pour l'instant, la fonction de rappel consigne simplement un message dans la console chaque fois qu'une tâche est identifiée:

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('index.html', {
    id: 'main',
    bounds: { width: 620, height: 500 }
  });
});
chrome.alarms.onAlarm.addListener(function( alarm ) {
  console.log("Got an alarm!", alarm);
});

Mettre à jour l'affichage HTML

Dans le fichier index.html, ajoutez un bouton Activer l'alarme:

<footer id="info">
  <button id="toggleAlarm">Activate alarm</button>
  ...
</footer>

Vous devez maintenant écrire le gestionnaire d'événements JavaScript pour ce nouveau bouton. Comme nous l'avons vu à l'étape 2, l'une des non-conformités les plus courantes avec CSP est causée par le code JavaScript intégré. Dans le fichier index.html, ajoutez cette ligne pour importer un fichier alarms.js que vous allez créer à l'étape suivante:

  </footer>
  ...
  <script src="js/app.js"></script>
  <script src="js/alarms.js"></script>
</body>

Créer un script d'alarmes

Dans votre dossier js, créez un fichier intitulé alarms.js.

Utilisez le code ci-dessous pour ajouter les méthodes checkAlarm(), createAlarm(), cancelAlarm() et toggleAlarm(), ainsi qu'un gestionnaire d'événements de clic pour activer/désactiver l'alarme lorsque l'utilisateur clique sur le bouton Activer l'alarme.

(function () {
  'use strict';
   var alarmName = 'remindme';
   function checkAlarm(callback) {
     chrome.alarms.getAll(function(alarms) {
       var hasAlarm = alarms.some(function(a) {
         return a.name == alarmName;
       });
       var newLabel;
       if (hasAlarm) {
         newLabel = 'Cancel alarm';
       } else {
         newLabel = 'Activate alarm';
       }
       document.getElementById('toggleAlarm').innerText = newLabel;
       if (callback) callback(hasAlarm);
     })
   }
   function createAlarm() {
     chrome.alarms.create(alarmName, {
       delayInMinutes: 0.1, periodInMinutes: 0.1});
   }
   function cancelAlarm() {
     chrome.alarms.clear(alarmName);
   }
   function doToggleAlarm() {
     checkAlarm( function(hasAlarm) {
       if (hasAlarm) {
         cancelAlarm();
       } else {
         createAlarm();
       }
       checkAlarm();
     });
   }
  $$('#toggleAlarm').addEventListener('click', doToggleAlarm);
  checkAlarm();
})();

Actualisez votre application et activez (et désactivez) l'alarme pendant quelques instants.

Inspecter les messages de la page d&#39;arrière-plan

Chaque fois que l'alarme est activée, des messages de journal devraient s'afficher dans la console chaque fois que l'alarme "se déclenche":

Messages d&#39;alarme imprimés dans la console

Voici ce que vous devez remarquer:

  • Même lorsque vous fermez la fenêtre de l'application Todo, les alarmes continuent de retentir.
  • Sur les plates-formes autres que ChromeOS, les alarmes ne se déclencheront pas si vous fermez complètement toutes les instances du navigateur Chrome.

Examinons un par un certains éléments de alarms.js qui utilisent les méthodes chrome.alarms.

Créer des alarmes

Dans createAlarm(), utilisez l'API chrome.alarms.create() pour créer une alarme lorsque l'option Activer l'alarme est activée.

chrome.alarms.create(alarmName, {delayInMinutes: 0.1, periodInMinutes: 0.1});

Le premier paramètre est une chaîne facultative identifiant un nom unique pour votre alarme, par exemple remindme. (Remarque: Vous devez donner un nom à l'alarme pour pouvoir l'annuler en indiquant son nom.)

Le deuxième paramètre est un objet alarmInfo. Les propriétés valides pour alarmInfo incluent when, delayInMinutes et periodInMinutes. Afin de réduire la charge sur l'ordinateur de l'utilisateur, Chrome limite les alarmes à une fois par minute. Nous utilisons ici des valeurs faibles (0,1 de minute) à des fins de démonstration uniquement.

Supprimer les alarmes

Dans cancelAlarm(), utilisez l'API chrome.alarms.clear() pour annuler une alarme lorsque l'option Annuler l'alarme est activée.

chrome.alarms.clear(alarmName);

Le premier paramètre doit être la chaîne d'identification que vous avez utilisée comme nom d'alarme dans chrome.alarms.create().

Le deuxième paramètre (facultatif) est une fonction de rappel qui doit adopter le format suivant:

function(boolean wasCleared) {...};

Obtenir des alarmes

Dans checkAlarm(), utilisez l'API chrome.alarms.getAll() pour obtenir un tableau de toutes les alarmes créées afin de mettre à jour l'état de l'UI du bouton d'activation.

getAll() accepte une fonction de rappel qui transmet un tableau d'objets Alarm. Pour voir le contenu d'un Alarm, vous pouvez inspecter les alarmes en cours d'exécution dans la console des outils de développement comme suit:

chrome.alarms.getAll(function(alarms) {
  console.log(alarms);
  console.log(alarms[0]);
});

Vous obtiendrez un objet tel que {name: "remindme", periodInMinutes: 0.1, scheduledTime: 1397587981166.858}, comme illustré ci-dessous:

Inspecter les alarmes en cours à l&#39;aide de getAll()

Préparez-vous pour la section suivante

Maintenant que les alarmes sont en place pour interroger l'application à intervalles réguliers, utilisez-les comme base pour ajouter des notifications visuelles.

Ajouter des notifications

Remplaçons la notification d'alarme par quelque chose que l'utilisateur peut facilement remarquer. Utilisez chrome.notifications pour afficher une notification sur le bureau semblable à celle-ci:

La notification de notre application Liste de tâches

Lorsque l'utilisateur clique sur la notification, la fenêtre de l'application Liste de tâches doit s'afficher.

Mettre à jour les autorisations des applications

Dans le fichier manifest.json, demandez l'autorisation "notifications":

"permissions": ["storage", "alarms", "notifications"],

Mettre à jour les scripts d'arrière-plan

Dans background.js, refactorisez le rappel chrome.app.window.create() dans une méthode autonome afin de pouvoir le réutiliser:

chrome.app.runtime.onLaunched.addListener(function() {
function launch() {
  chrome.app.window.create('index.html', {
    id: 'main',
    bounds: { width: 620, height: 500 }
  });
}
});
chrome.app.runtime.onLaunched.addListener(launch);
...

Mettre à jour l'écouteur d'alarmes

En haut du fichier background.js, ajoutez une variable pour un nom de base de données utilisé dans l'écouteur d'alarmes:

var dbName = 'todos-vanillajs';

La valeur de dbName correspond au nom de base de données défini à la ligne 17 de js/app.js:

var todo = new Todo('todos-vanillajs');

Créer une notification

Au lieu de simplement consigner une nouvelle alarme dans la console, mettez à jour l'écouteur onAlarm pour obtenir les données stockées via chrome.storage.local.get() et appelez une méthode showNotification():

chrome.alarms.onAlarm.addListener(function( alarm ) {
  console.log("Got an alarm!", alarm);
  chrome.storage.local.get(dbName, showNotification);
});

Ajoutez cette méthode showNotification() à background.js:

function launch(){
  ...
}

function showNotification(storedData) {
  var openTodos = 0;
  if ( storedData[dbName].todos ) {
    storedData[dbName].todos.forEach(function(todo) {
      if ( !todo.completed ) {
        openTodos++;
      }
    });
  }
  if (openTodos>0) {
    // Now create the notification
    chrome.notifications.create('reminder', {
        type: 'basic',
        iconUrl: 'icon_128.png',
        title: 'Don\'t forget!',
        message: 'You have '+openTodos+' things to do. Wake up, dude!'
     }, function(notificationId) {});
  }
}

chrome.app.runtime.onLaunched.addListener(launch);
...

showNotification() vérifiera les tâches ouvertes (non terminées). S'il y a au moins une tâche ouverte, créez un pop-up de notification via chrome.notifications.create().

Le premier paramètre est un nom de notification permettant d'identifier de manière unique la notification. Vous devez disposer d'un identifiant pour effacer ou gérer les interactions avec cette notification particulière. Si l'ID correspond à une notification existante, create() efface d'abord cette notification avant d'en envoyer une nouvelle.

Le deuxième paramètre est un objet NotificationOptions. Il existe de nombreuses options pour afficher le pop-up de notification. Ici, nous utilisons une notification "de base" avec une icône, un titre et un message. Les autres types de notifications incluent les images, les listes et les indicateurs de progression. N'hésitez pas à revenir à cette section lorsque vous aurez terminé l'étape 3 et expérimenter d'autres fonctionnalités de notification.

Le troisième paramètre (facultatif) est une méthode de rappel qui doit adopter le format suivant:

function(string notificationId) {...};

Gérer les interactions avec les notifications

Ouvrez l'application Liste de tâches lorsque l'utilisateur clique sur la notification. À la fin de background.js, créez un gestionnaire d'événements chrome.notifications.onClicked:

chrome.notifications.onClicked.addListener(function() {
  launch();
});

Le rappel du gestionnaire d'événements appelle simplement la méthode launch(). chrome.app.window.create() crée une fenêtre d'application Chrome s'il n'en existe pas déjà une, ou met en avant la fenêtre actuellement ouverte dont l'ID est main.

Lancer votre application Todo terminée

Vous avez terminé l'étape 3 ! Actualisez votre application Todo avec les rappels.

Vérifiez que ces comportements fonctionnent comme prévu:

  • Si aucune tâche n'est en cours, aucune notification ne s'affiche dans une fenêtre pop-up.
  • Si vous cliquez sur la notification lorsque votre application est fermée, l'application Todo s'ouvre ou s'affiche au premier plan.

Dépannage

Votre fichier background.js final doit se présenter comme suit . Si les notifications ne s'affichent pas, vérifiez que vous utilisez Chrome 28 ou une version ultérieure. Si les notifications ne s'affichent toujours pas, recherchez les messages d'erreur dans la console DevTools, à la fois dans la fenêtre principale (clic droit > Inspecter l'élément) et sur la page d'arrière-plan (clic droit > Inspecter la page en arrière-plan).

Pour en savoir plus

Pour plus d'informations sur certaines des API présentées à cette étape, reportez-vous à:

Prêt à passer à l'étape suivante ? Passez à l'Étape 4 : Ouvrir des liens externes avec une WebView »