PD-105 — Implementer push notifications¶
1. Objectif¶
Definir le contrat fonctionnel et non fonctionnel des notifications push iOS pour les evenements probatoires significatifs, afin de garantir :
- l'information en temps quasi reel des changements probatoires,
- la capacite d'action de l'utilisateur depuis la notification,
- la non-divulgation de donnees sensibles dans les payloads push,
- la tracabilite locale via un centre de notifications in-app et un badge coherent.
Elements non directement testables et donc hors perimetre contractuel :
- perception subjective de "confiance" par l'utilisateur,
- appreciation qualitative du style redactionnel des messages.
2. Perimetre / Hors perimetre¶
Inclus¶
- Plateforme iOS uniquement, transport APNs.
- Notifications de type silent et alert (sans rich notifications).
- Flux metier phase 1 : nouveau document, scellement, partage.
- Enregistrement et revocation du device token cote backend.
- Reception et traitement des notifications en foreground, background et app terminee.
- Historique local des notifications dans un centre in-app.
- Badge iOS representant le nombre de notifications non lues.
- Navigation contextuelle au tap sur notification.
- Demande de permission notifications avec message de valeur probatoire.
Exclu¶
- Android / FCM.
- Synchronisation cross-device de l'historique des notifications.
- Rich notifications (media, actions avancees, extensions).
- Notifications sans valeur probatoire (ouverture repetee, telechargement sans impact, acces techniques sans consequence, lecture implicite non declaree).
- Mesure de satisfaction utilisateur (hors perimetre, non testable de maniere deterministe).
3. Definitions¶
- APNs : Apple Push Notification service.
- Device token : identifiant APNs du device/app/environnement permettant l'acheminement d'une notification.
- Notification silent : push sans alerte visuelle/sonore, destinee a une synchronisation en arriere-plan.
- Notification alert : push avec alerte utilisateur visible (et badge eventuel).
- Evenement probatoire significatif : evenement appartenant a au moins une categorie de la doctrine (echec/degradation, revocation d'acces, modification de perimetre, echeance critique, rupture de continuite, action engageante d'un tiers, anomalie de securite, changement de statut legal).
- CRITIQUE : niveau de criticite eleve necessitant une alerte utilisateur immediate via notification alert.
- HAUTE-CRITIQUE : niveau de criticite maximal necessitant une alerte utilisateur immediate via notification alert.
- HAUTE : niveau de criticite important traite en phase 1 sans alerte utilisateur immediate.
- Donnee sensible : information nominative ou contextuelle exploitable directement (ex. titre document, identite explicite, contenu juridique).
- Identifiant opaque : identifiant non semantique ne permettant pas d'inferer la donnee metier sans appel backend autorise.
- Notification lue : notification marquee comme lue lorsque l'utilisateur ouvre le detail de cette notification dans le centre in-app.
Catalogue exhaustif des evenements phase 1 et criticite associee :
| Evenement phase 1 | Criticite |
|---|---|
| Nouveau document partage | HAUTE |
| Document scelle avec succes | HAUTE |
| Echec de scellement | CRITIQUE |
| Revocation d'acces | CRITIQUE |
| Echeance critique imminente | HAUTE-CRITIQUE |
4. Invariants (non negociables)¶
| ID | Regle | Justification |
|---|---|---|
| INV-105-01 | Le perimetre d'execution est limite a iOS + APNs pour PD-105. | Conforme au perimetre phase 1. |
| INV-105-02 | Toute notification emise DOIT correspondre a un evenement probatoire significatif; tout evenement liste comme "non a notifier" est interdit. | Eviter le bruit et la perte de confiance. |
| INV-105-03 | Le device token DOIT etre enregistre au premier contexte authentifie et a chaque changement de token. | Garantir la joignabilite APNs. |
| INV-105-04 | Le device token DOIT pouvoir etre revoque cote backend lors de la deconnexion explicite utilisateur. | Limiter les envois non desirees apres fin de session. |
| INV-105-05 | Les notifications silent NE DOIVENT produire ni alerte visuelle, ni son, ni vibration. | Respect du comportement "sans deranger". |
| INV-105-06 | Les notifications alert DOIVENT etre utilisees pour les evenements de criticite CRITIQUE et HAUTE-CRITIQUE, selon le catalogue phase 1 fige en section 3. | Aligner criticite et canal d'attention. |
| INV-105-07 | Le payload push NE DOIT contenir aucune donnee sensible; seuls des identifiants opaques et metadonnees techniques minimales sont autorises. | Exigence de securite et confidentialite. |
| INV-105-08 | Chaque notification recue DOIT etre historisee localement avec un identifiant unique global de notification (UUID v4), un type d'evenement, un horodatage de reception et un statut lu/non lu. | Traçabilite et auditabilite locale. |
| INV-105-09 | Le badge iOS DOIT etre strictement egal au nombre de notifications non lues dans le centre in-app. | Cohérence fonctionnelle. |
| INV-105-10 | Un tap utilisateur sur notification DOIT ouvrir le contexte cible; si indisponible, l'app DOIT ouvrir le detail de notification avec message d'indisponibilite contextuelle. | Garantir l'actionnabilite meme en cas de contexte manquant. |
| INV-105-11 | Le backend DOIT tenter l'envoi APNs avec une latence p95 <= 5 secondes apres l'evenement declencheur. | Contrainte de latence metier. |
| INV-105-12 | Le taux de livraison APNs des notifications alert DOIT etre >= 99% sur fenetre glissante de 30 jours. | Exigence de fiabilite operationnelle. |
| INV-105-13 | Les notifications push DOIVENT etre testees sur build EAS iOS; Expo Go est non valide pour l'acceptation. | Contrainte plateforme connue. |
| INV-105-14 | L'historique local des notifications DOIT appliquer une retention de 90 jours glissants. | Limiter la conservation locale et maitriser le volume stocke. |
5. Flux nominaux¶
FN-105-01 — Enregistrement initial du device token¶
- Etant donne un utilisateur authentifie sur iOS, l'application obtient le device token APNs.
- L'application transmet le token au backend avec son contexte minimal (user, device, environnement).
- Le backend confirme l'enregistrement.
- Le token est marque actif pour ce couple utilisateur/device.
Resultat attendu : le device est eligible a la reception de notifications de la story.
FN-105-02 — Rotation du device token¶
- Le token APNs change.
- L'application detecte le changement et transmet le nouveau token.
- Le backend invalide l'ancien token et active le nouveau.
Resultat attendu : aucun envoi futur sur token obsolete.
FN-105-03 — Reception d'une notification silent¶
- Un evenement probatoire significatif necessitant sync silencieuse est declenche.
- Le backend envoie une notification silent.
- L'application traite la synchronisation en arriere-plan.
- L'historique in-app est mis a jour selon politique de phase 1.
Resultat attendu : donnees locales synchronisees sans interruption utilisateur visible.
FN-105-04 — Reception d'une notification alert¶
- Un evenement CRITIQUE ou HAUTE-CRITIQUE est declenche.
- Le backend envoie une notification alert.
- iOS affiche l'alerte a l'utilisateur (selon permissions systeme).
- L'application enregistre l'evenement dans le centre in-app en non lu.
- Le badge est incremente pour rester coherent avec les non lus.
Resultat attendu : information visible + tracabilite locale + badge coherent.
FN-105-05 — Consultation centre de notifications¶
- L'utilisateur ouvre le centre in-app.
- La liste des notifications historisees est affichee du plus recent au plus ancien.
- La consultation marque les elements selon la regle de lecture definie.
- Le badge est recalcule immediatement.
Resultat attendu : etat lu/non lu coherent entre UI in-app et badge iOS.
FN-105-06 — Navigation contextuelle sur tap¶
- L'utilisateur tape une notification (systeme ou centre in-app).
- L'application resolve le contexte metier cible via identifiants opaques.
- L'application ouvre l'ecran cible (document, partage, evenement) ou fallback detail notification si contexte indisponible.
Resultat attendu : aucun tap sans issue fonctionnelle.
FN-105-07 — Demande de permission notifications¶
- Avant le premier besoin d'alerte utilisateur, l'application presente la demande de permission.
- Le message explicite la valeur probatoire de l'activation.
- Le choix utilisateur est conserve par le systeme iOS.
Resultat attendu : consentement explicite et tracable cote systeme.
5b. Diagrammes¶
Diagramme d'etats — Cycle de vie du device token (INV-105-03, INV-105-04)¶
stateDiagram-v2
[*] --> Unregistered
Unregistered --> Active : Enregistrement initial\n(FN-105-01, INV-105-03)
Active --> Active : Rotation token\n(FN-105-02, INV-105-03)
Active --> Invalid : Token rejete par APNs\n(ERR-105-02)
Active --> Revoked : Deconnexion explicite\n(INV-105-04)
Invalid --> Active : Re-enregistrement\n(ERR-105-02)
Revoked --> Active : Nouvelle authentification\n(INV-105-03)
Invalid --> [*]
Revoked --> [*] Diagramme d'etats — Cycle de vie d'une notification locale (INV-105-08, INV-105-09)¶
stateDiagram-v2
[*] --> Received : Notification recue\n(INV-105-08)
Received --> Unread : Historisee localement\n(UUID v4 + horodatage)
Unread --> Read : Ouverture detail in-app\n(FN-105-05)
Unread --> Expired : Retention > 90 jours\n(INV-105-14)
Read --> Expired : Retention > 90 jours\n(INV-105-14)
Expired --> [*]
note right of Unread : Badge iOS = count(Unread)\n(INV-105-09) Diagramme de sequence — Emission et reception d'une notification alert (INV-105-06, INV-105-07, INV-105-11)¶
sequenceDiagram
participant Backend
participant APNs
participant iOS as iOS System
participant App as ProbatioVault App
participant Store as Historique local
Note over Backend: Evenement probatoire\nCRITIQUE / HAUTE-CRITIQUE\n(INV-105-06)
Backend->>Backend: Construire payload\n(identifiants opaques uniquement, INV-105-07)
Backend->>APNs: Envoi notification alert\n(p95 <= 5s, INV-105-11)
APNs-->>Backend: Acknowledgement
alt App en foreground
APNs->>App: Notification recue
App->>Store: Historiser (UUID v4, type, timestamp, non lu)\n(INV-105-08)
App->>iOS: Mettre a jour badge = count(non lus)\n(INV-105-09)
App->>App: Afficher banniere in-app
else App en background / terminee
APNs->>iOS: Notification systeme
iOS->>iOS: Afficher alerte + badge
iOS->>App: Reveil background (si autorise)
App->>Store: Historiser (UUID v4, type, timestamp, non lu)\n(INV-105-08)
end Diagramme de sequence — Enregistrement et rotation du device token (INV-105-03, INV-105-04)¶
sequenceDiagram
participant User as Utilisateur
participant App as ProbatioVault App
participant APNs
participant Backend
User->>App: Authentification
App->>APNs: Demande device token
APNs-->>App: Device token
App->>Backend: POST /device-tokens {token, device, env}\n(INV-105-03)
Backend-->>App: 201 Created (token actif)
Note over APNs: Token change (rotation systeme)
APNs->>App: Nouveau device token
App->>Backend: PUT /device-tokens {nouveau token}\n(INV-105-03)
Backend->>Backend: Invalider ancien token
Backend-->>App: 200 OK (nouveau token actif)
Note over User: Deconnexion explicite
User->>App: Logout
App->>Backend: DELETE /device-tokens\n(INV-105-04)
Backend->>Backend: Revoquer token
Backend-->>App: 200 OK (token revoque) 6. Cas d'erreur¶
| ID | Cas d'erreur | Reponse attendue |
|---|---|---|
| ERR-105-01 | Echec d'enregistrement token (reseau/backend indisponible) | Retenter selon politique de reprise; aucun crash; journaliser l'echec; reessayer au prochain cycle d'activation app/session. |
| ERR-105-02 | Token invalide ou rejete par APNs | Backend marque le token invalide et stoppe les envois vers ce token; demande de re-enregistrement au prochain token valide. |
| ERR-105-03 | Permission notifications refusee par l'utilisateur | Aucune alerte push affichee; l'app conserve l'historique local des evenements synchronises disponibles; proposer point d'entree vers reglages iOS (sans boucle intrusive). |
| ERR-105-04 | Payload non conforme securite (donnee sensible detectee) | Notification rejetee avant emission; evenement de securite journalise; aucun envoi APNs effectue. |
| ERR-105-05 | Contexte cible introuvable au tap | Ouverture du detail notification avec message de fallback; notification reste traçable et actionnable au minimum. |
| ERR-105-06 | Desalignement badge vs non lus detecte | Reconciliation immediate au prochain lancement/refresh; badge recalcule a partir de l'historique local. |
| ERR-105-07 | Latence d'envoi avec p95 > 5s | Incident metrique enregistre; evenement comptabilise en non-conformite NFR pour suivi. |
| ERR-105-08 | Build de validation execute dans Expo Go | Resultat de test declare non recevable pour acceptation de PD-105. |
7. Criteres d'acceptation (testables)¶
| ID | Critere | Observable |
|---|---|---|
| CA-105-01 | Le token APNs est enregistre au premier contexte authentifie. | Trace backend d'un enregistrement token actif lie a l'utilisateur/device apres login initial. |
| CA-105-02 | Toute rotation de token met a jour le token actif et invalide l'ancien. | Ancien token marque inactif; nouveau token actif; absence d'envoi sur ancien token dans les logs d'envoi. |
| CA-105-03 | Une notification silent declenche une synchronisation en background sans alerte visible/sonore. | Aucune banniere/son; donnees locales synchronisees; log de traitement background present. |
| CA-105-04 | Une notification alert pour evenement CRITIQUE/HAUTE-CRITIQUE est affichee et historisee non lue. | Alerte iOS visible; entree in-app creee avec statut non lu. |
| CA-105-05 | Le badge iOS est toujours egal au nombre de notifications non lues. | Egalite stricte badge systeme = compteur non lu in-app dans les cas de test. |
| CA-105-06 | Le tap sur notification ouvre le contexte cible ou un fallback detail explicite. | Navigation vers ecran attendu; sinon ecran detail notification avec motif d'indisponibilite. |
| CA-105-07 | Le payload push ne contient aucune donnee sensible. | Inspection des payloads: absence de titre document, nom personne, contenu metier sensible; presence d'identifiants opaques uniquement. |
| CA-105-08 | Le backend tente l'envoi APNs avec une latence p95 <= 5s apres evenement declencheur. | Mesure horodatee evenement->tentative APNs avec p95 <= 5s sur la fenetre de mesure. |
| CA-105-09 | Le taux de livraison APNs des alerts est >= 99% sur 30 jours. | Tableau metrique de livraison APNs sur fenetre glissante 30j >= 99%. |
| CA-105-10 | Les tests d'acceptation push sont executes sur build EAS iOS, pas Expo Go. | Rapports d'execution identifies comme EAS; aucune preuve de validation Expo Go acceptee. |
| CA-105-11 | Les notifications non pertinentes selon doctrine ne sont pas emises. | Campagne negative: zero emission pour evenements explicitement exclus. |
| CA-105-12 | La permission est demandee avec explication de valeur probatoire avant premier usage d'alert. | Presence de prompt systeme precede d'un ecran/message explicatif auditable en test fonctionnel. |
| CA-105-13 | La deconnexion explicite utilisateur revoque le device token actif cote backend. | Trace backend de revocation du token lors du logout; absence d'envoi ulterieur sur ce token. |
8. Scenarios de test (Given / When / Then)¶
TC-105-01 — Enregistrement initial token (CA-105-01, INV-105-03)¶
Given un utilisateur iOS authentifie pour la premiere fois et un token APNs valide
When l'application initialise le service notifications
Then un enregistrement token actif est visible cote backend pour ce user/device.
TC-105-02 — Rotation token (CA-105-02, INV-105-03)¶
Given un ancien token actif et un nouveau token emis par APNs
When l'application detecte le changement et soumet le nouveau token
Then l'ancien token est inactif et le nouveau token est actif.
TC-105-03 — Silent sans perturbation (CA-105-03, INV-105-05)¶
Given une notification silent valide pour un evenement de sync
When le device recoit la push en background
Then aucune alerte visuelle/sonore n'est produite et la sync est executee.
TC-105-04 — Alert critique affichee (CA-105-04, INV-105-06)¶
Given un evenement de criticite CRITIQUE
When le backend emet une notification alert
Then iOS affiche l'alerte et une entree non lue est ajoutee au centre in-app.
TC-105-05 — Cohesion badge/non lu (CA-105-05, INV-105-09)¶
Given trois notifications non lues dans le centre in-app
When l'application recalcule le badge
Then la valeur badge iOS est 3.
TC-105-06 — Navigation contextuelle succes (CA-105-06, INV-105-10)¶
Given une notification avec contexte resolvable
When l'utilisateur tape la notification
Then l'application ouvre l'ecran cible attendu.
TC-105-07 — Navigation contextuelle fallback (CA-105-06, INV-105-10)¶
Given une notification dont le contexte n'est plus disponible
When l'utilisateur tape la notification
Then l'application ouvre l'ecran detail notification avec motif d'indisponibilite.
TC-105-08 — Confidentialite payload (CA-105-07, INV-105-07)¶
Given un lot de payloads push emis en preproduction
When un audit de contenu est execute
Then aucune donnee sensible n'est detectee et seuls des identifiants opaques sont presents.
TC-105-09 — Latence backend (CA-105-08, INV-105-11)¶
Given des evenements declencheurs horodates
When le backend emet les pushes APNs
Then le delai evenement->tentative APNs respecte <= 5s selon seuils definis.
TC-105-10 — Fiabilite livraison (CA-105-09, INV-105-12)¶
Given une fenetre glissante de 30 jours de notifications alert
When le taux de livraison APNs est calcule
Then le taux est >= 99%.
TC-105-11 — Filtre anti-bruit (CA-105-11, INV-105-02)¶
Given des evenements exclus (ouverture repetee, telechargement sans impact, acces technique sans consequence)
When le moteur de dispatch evalue l'emission
Then aucune notification n'est envoyee.
TC-105-12 — Contexte de validation EAS (CA-105-10, INV-105-13)¶
Given une campagne d'acceptation push
When les preuves d'execution sont collectees
Then seules les executions sur build EAS iOS sont acceptees.
9. Hypotheses explicites¶
| ID | Hypothese | Impact si faux |
|---|---|---|
| H-105-01 | Le backend expose des endpoints operationnels pour enregistrer et revoquer les tokens device. | Sans endpoint, F-105-01 est inapplicable et le flux push est bloque. |
| H-105-02 | Les credentials APNs (Auth Key p8) sont disponibles et valides dans l'environnement cible. | Sans credentials valides, aucun envoi APNs possible. |
| H-105-03 | Les entitlements iOS Push Notifications sont actifs sur les builds EAS utilises pour tests/production. | Sans entitlement, reception push impossible cote app. |
| H-105-04 | Un catalogue officiel des types d'evenements phase 1 est valide par PO/PMO avant gate de conformite. | Sans catalogue, INV-105-02 et INV-105-06 restent partiellement non evaluables. |
| H-105-05 | La metrique de livraison APNs est disponible (acknowledgement APNs + instrumentation backend). | Sans metrique fiable, CA-105-09 non demontrable. |
| H-105-06 | Le stockage local retenu (SecureStore ou SQLite chiffre) respecte les exigences de persistance locale de l'app. | Sans stockage persistant conforme, historique/badge non fiables. |
10. Points a clarifier¶
- Catalogue exact des evenements phase 1 : catalogue fige en section 3 pour PD-105; toute extension est hors perimetre de cette specification.
- Politique de localisation : langue unique FR ou FR/EN pour le texte des alertes.
- Opt-out granulaire : activation/desactivation par categorie autorisee ou non pour phase 1.
- Regle de lecture : une notification devient "lue" a l'ouverture du detail de cette notification dans le centre in-app.
- Fenetre de mesure latence reception : la NFR contractualise la latence d'envoi backend (p95 <= 5s); le seuil de reception reste a contractualiser si requis.
- Definition de "traitee correctement" en background (>95%) : criteres exacts de succes/erreur a fixer pour test non ambigu.
References¶
- Epic : MOBILE-IOS (PD-195)
- JIRA : PD-105
- Repos concernes : ProbatioVault-app (frontend), ProbatioVault-backend
- Documents associes : PD-105-besoin.md