Création d’une app pour la cantine (partie 2/4)

Baptiste Carlier
4 min readJan 15, 2020

--

Si vous n’avez pas compris le contexte, revenez un peu en arrière :
⬅️ Données & stockage via Firebase Cloud Firestore 📦

Maintenant qu’on a nos données, il s’agirait d’en faire un peu quelque chose. Je ne vous ai pas encore montré le design de l’application parce que je réserve ça pour l’article suivant mais à ce stade elle est déjà fonctionnelle. Ouverture, récupération des données, affichage d’un menu, sélection d’une date pour avoir le menu d’un autre jour.

À partir de là ce qui m’intéresse le plus, ce sont les notifications. Flemmard, je n’ai pas envie d’ouvrir l’application. Je veux juste être alerté automatiquement de ce que ma fille va déjeuner, et à la limite au moment même où elle est à table.

C’est parti pour les…

2. Notifications via FCM 🔔

Je me pose alors plusieurs questions :

  • Est-ce que je dois envoyer le contenu du menu dans un notification ?
    👍 Envoie d’une notification qui se suffit à elle-même
    👎 Nécessite d’avoir les infos côté back-end
  • Est-ce que je dois envoyer moi-même la notification ou alors mettre en place une notification automatique dans l’app ?
    👍 Pas besoin de gérer un système back-end pour l’envoi
    👎 Le WorkManager est bien mais un peu lourd pour une tâche si simple
  • J’envoie une notification tous les jours ou seulement les jours d’école ?
    👍 Ce n’est que 4 jours par semaine
    👎 Nécessite de connaître les jours avec école (cf vacances, jours fériés)
  • Comment je fais pour tester sur mon device quand ça sera en production ?
    ❗ ️Attention à ne pas spammer tout le monde avec mes tests
  • Est-ce que je me contente d’envoyer uniquement des notifications sur les menus ?

Comme quoi ! Il en résulte pas mal de petites choses qui structurent l’architecture de l’app et du projet dans sa globalité.

Une solution simple : des calls FCM sur Raspberry Pi

Pour envoyer une notification sur Android, il faut passer par Firebase Cloud Messaging (FCM). C’est quasiment une constante.

Quoi ? Je fais du prosélytisme pour Firebase encore ? C’est possible oui.
Mais c’est surtout très pratique !

FMC permet d’envoyer des messages facilement sur des terminaux. C’en est d’ailleurs assez perturbant à quel point cela peut être simple et rapide.

La solution retenue est donc d’avoir mon premier back-end “physique” pour envoyer des notifications. Je pars sur un Raspberry Pi parce que je l’ai déjà fait.

À l’aide de ce bon vieux cron et d’un petit shell qui détermine s’il s’agit d’un jour d’école ou non, j’envoie une notification FCM aux appareils. Et voilà !

Sur le Raspberry, je ne stock pas mes données mais juste les jours auxquels il faut que j’envoie la notification. Quand le téléphone reçoit l’information, il va vérifier si :

  1. C’est le bon jour.
  2. Le menu est disponible en local (en hors-ligne Firestore).
  3. Si le menu n’est pas disponible, il va aller chercher les données dans Firestore en ligne. Au passage le Firestore local sera à jour avec tous les menus disponibles pour le moment.
  4. Enfin afficher la notification.

Simple, pas cher & efficace. La seule chose que j’ai à faire est de mettre à jour la liste des jours auxquels envoyer une notification.
Et encore, si je veux faire un mode dégrader où j’envoie une notification tous les jours : je peux. Car côté mobile il y a aussi une vérification de la disponibilité du menu avant d’afficher quoi que ce soit.

Axes d’amélioration

  1. Je n’ai trouvé qu’un seul inconvénient à cette architecture : si l’utilisateur n’a pas Internet à l’heure de l’envoie de la notification, il aura la notification en retard. Cependant, si la gestion était uniquement côté mobile, la notification serait lancée même sans réseau. 🤔
    Je changerai peut-être de paradigme un jour (ou pas).
  2. Pour me défaire du Raspberry, je peux aussi déporter les appels sur les Cloud Functions for Firebase.

dev VS prod

Arrivé à ce stade, je commence à me dire que je vais pouvoir transmettre l’application à d’autres parents d’élève. Cependant, si je veux pouvoir développer tranquillement dans mon coin, il faut que je puisse n’envoyer des notifications de test qu’à moi-même.

C’est là que les topics de FCM entre en jeu. Sur FCM, il est possible d’envoyer des notifications à :

  • Un utilisateur en particulier si on a son ID
  • Un groupe particulier d’utilisateurs
  • Des utilisateurs s’étonnant abonnés à des ‘topics’

De ce fait, les utilisateurs de production s’inscriront à un topic de production tandis que les utilisateurs de dev s’inscriront à un topic de dev.

Des notifications autres que le menu

J’en profite pour ajouter un topic afin que les utilisateurs reçoivent des informations sur l’école. On verra ce qu’on y met plus tard mais au moins c’est là. 🤓

L’architecture à cette étape :

--

--