fix: Gérer correctement l'expiration premium côté iOS

Resolved 💬 2 comments Opened Nov 29, 2025 by sebastienkothe Closed Nov 29, 2025

Contexte

L'expiration premium est correctement gérée côté backend (checkPremiumStatus() vérifie premiumExpiresAt à chaque requête), mais côté iOS plusieurs lacunes existent.

Problèmes identifiés

1. iOS User n'a pas premiumExpiresAt

  • Le modèle User.swift ne contient que isPremium: Bool
  • L'app ne peut pas vérifier localement si le premium est expiré
  • Impact : Badge premium affiché même après expiration

2. checkCurrentEntitlements() jamais appelé au lancement

  • La fonction existe dans PremiumManager.swift:197 mais n'est jamais invoquée
  • Pas de vérification StoreKit → Backend au démarrage de l'app
  • Impact : Désynchronisation entre StoreKit et Firestore

3. Pas de fonction scheduled backend

  • Aucune Cloud Function ne nettoie les isPremium: true expirés
  • Le flag reste indéfiniment dans Firestore
  • Impact : Données incohérentes (isPremium: true mais expiré)

4. Pas de webhook Apple S2S (Server-to-Server)

  • Le backend n'est pas notifié des annulations/expirations par Apple
  • On dépend uniquement du client pour sync
  • Impact : Si l'utilisateur n'ouvre pas l'app, Firestore n'est pas mis à jour

Comportement actuel

| Composant | Comportement |
|-----------|--------------|
| Backend | ✅ Vérifie premiumExpiresAt à chaque requête |
| iOS UI | ❌ Affiche badge premium même si expiré |
| Firestore | ❌ isPremium: true persiste après expiration |

Résultat : UX confuse mais pas de fuite de récompenses (backend refuse les bénéfices)

Solution proposée

Phase 1 - iOS (prioritaire)

  • [ ] Ajouter premiumExpiresAt: Date? au modèle User.swift
  • [ ] Créer computed property isEffectivelyPremium qui vérifie l'expiration
  • [ ] Utiliser isEffectivelyPremium au lieu de isPremium pour l'UI
  • [ ] Appeler checkCurrentEntitlements() au lancement de l'app (ou retour foreground)

Phase 2 - Backend (optionnel mais recommandé)

  • [ ] Créer fonction scheduled cleanupExpiredPremium (quotidienne)
  • [ ] Implémenter webhook Apple S2S pour notifications d'abonnement

Fichiers concernés

iOS :

  • Domain/Models/User.swift
  • Shared/Services/Premium/PremiumManager.swift
  • Presentation/Features/Root/Views/AppRouterView.swift (ou équivalent pour app launch)

Backend :

  • functions/src/index.ts (nouvelle fonction scheduled)

Priorité

Medium - L'intégrité des récompenses est préservée (backend), seule l'UX est impactée.

View original on GitHub ↗

This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗