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.swiftne contient queisPremium: 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:197mais 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: trueexpiré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èleUser.swift - [ ] Créer computed property
isEffectivelyPremiumqui vérifie l'expiration - [ ] Utiliser
isEffectivelyPremiumau lieu deisPremiumpour 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.swiftShared/Services/Premium/PremiumManager.swiftPresentation/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.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗