AppMaker Studio
iOS

StoreKit 2 : Monétiser son app iOS simplement

Andy
5 Septembre 2025
8 min de lecture

StoreKit 2, introduit avec iOS 15, simplifie considérablement l'implémentation des achats in-app. Fini le code callback complexe : place à async/await et aux APIs modernes. Voici comment l'implémenter correctement.

Les bases de StoreKit 2

StoreKit 2 utilise Swift Concurrency (async/await) pour toutes ses opérations. Le code est plus lisible et plus facile à déboguer que l'ancienne API basée sur les delegates.

Les produits sont récupérés via Product.products(for:) avec leurs identifiants configurés dans App Store Connect. La vérification des transactions est automatique avec JWS (JSON Web Signature).

Transaction.currentEntitlements fournit un stream asynchrone de toutes les transactions actives de l'utilisateur, facilitant la vérification des droits.

swift
import StoreKit

class StoreManager: ObservableObject {
    @Published var products: [Product] = []
    @Published var purchasedProductIDs: Set<String> = []
    
    func loadProducts() async throws {
        let productIDs = ["pro_monthly", "pro_yearly", "lifetime"]
        products = try await Product.products(for: productIDs)
    }
    
    func purchase(_ product: Product) async throws -> Transaction? {
        let result = try await product.purchase()
        
        switch result {
        case .success(let verification):
            let transaction = try checkVerified(verification)
            await transaction.finish()
            return transaction
        case .userCancelled, .pending:
            return nil
        @unknown default:
            return nil
        }
    }
}

Gestion des abonnements

Pour les abonnements, Product.SubscriptionInfo contient toutes les métadonnées : période, prix localisé, offre d'essai, statut de renouvellement.

Vérifiez le statut d'abonnement avec Transaction.currentEntitlements et filtrez par productType == .autoRenewable. Cela inclut les abonnements actifs, en période de grâce, ou expirés.

Gérez les changements d'abonnement (upgrade, downgrade, annulation) en observant Transaction.updates, un AsyncSequence qui émet les nouvelles transactions.

Restauration des achats

StoreKit 2 simplifie la restauration. AppStore.sync() force une synchronisation avec le serveur Apple et met à jour les entitlements locaux.

Pour la plupart des cas, Transaction.currentEntitlements suffit. La restauration explicite n'est nécessaire que si l'utilisateur se connecte avec un nouvel Apple ID.

Affichez toujours un bouton 'Restaurer les achats' dans vos paramètres. C'est requis par les guidelines App Store.

Validation côté serveur

Bien que StoreKit 2 vérifie automatiquement les transactions avec JWS, une validation serveur reste recommandée pour les contenus sensibles.

L'App Store Server API v2 permet de vérifier les transactions, obtenir l'historique d'achat, et recevoir des notifications serveur-à-serveur pour les événements d'abonnement.

Stockez les originTransactionId pour chaque achat. C'est l'identifiant stable qui persiste à travers les renouvellements et restaurations.

swift
// Vérification de l'état des abonnements
func checkSubscriptionStatus() async -> Bool {
    for await result in Transaction.currentEntitlements {
        guard case .verified(let transaction) = result else {
            continue
        }
        
        if transaction.productType == .autoRenewable {
            // Vérifier si non expiré et non révoqué
            if transaction.revocationDate == nil,
               transaction.expirationDate ?? Date() > Date() {
                return true
            }
        }
    }
    return false
}

Pièges à éviter

Testez en Sandbox ET avec TestFlight. Le comportement diffère parfois entre les environnements. Les transactions Sandbox expirent en accéléré (1 mois = 5 minutes).

Gérez les cas d'erreur gracieusement. Les achats peuvent échouer pour de nombreuses raisons : pas de connexion, restrictions parentales, problème de paiement.

N'oubliez pas d'appeler transaction.finish() après avoir accordé le contenu. Sans cela, la transaction reste en attente et sera re-délivrée au prochain lancement.

Conclusion

StoreKit 2 rend la monétisation iOS beaucoup plus accessible. Avec async/await et la vérification automatique, vous pouvez implémenter des achats in-app robustes en quelques heures. Prenez le temps de bien tester en Sandbox et de gérer tous les cas limites pour une expérience utilisateur sans friction.