Qu'est-ce que StoreKit et pourquoi l'utiliser ?
StoreKit est le framework natif d'Apple dédié à la gestion des achats intégrés (In-App Purchases) et des abonnements dans les applications iOS, macOS, watchOS et tvOS. Il offre aux développeurs une interface unifiée pour interagir avec l'App Store : demande de produits, traitement des transactions, vérification des droits d'accès et gestion des abonnements.
Les principales fonctionnalités de StoreKit :
- Monétisation — vente de biens numériques (accès premium, monnaie virtuelle, contenu exclusif).
- Gestion des abonnements — renouvellements automatiques, statuts, périodes d'essai.
- Sécurité — traitement des paiements via l'App Store sans transmettre les données bancaires au développeur.
- Restauration des achats — l'utilisateur peut retrouver ses achats sur un autre appareil.
À noter : StoreKit n'est pas une bibliothèque tierce, mais un framework intégré au SDK Xcode. Il n'est pas nécessaire de l'installer séparément, mais il faut le configurer dans App Store Connect et l'ajouter à votre projet.
Installation et configuration
StoreKit étant un framework système, son installation se résume à l'ajouter à votre projet Xcode :
- Ouvrez votre projet dans Xcode.
- Sélectionnez votre cible (application) → onglet "General".
- Descendez jusqu'à la section "Frameworks, Libraries, and Embedded Content".
- Cliquez sur "+" et choisissez StoreKit.framework.
- Assurez-vous que le statut "Embed" est défini sur "Do Not Embed".
Importez ensuite le framework dans les fichiers nécessaires :
import StoreKit
Vous devez également configurer vos produits dans App Store Connect :
- Créez des identifiants de produits (ex.
com.example.premium). - Définissez le prix, la localisation et le type (consommable / non-consommable / abonnement).
- Pour les abonnements, configurez les groupes et les périodes d'essai.
Démarrage rapide avec un exemple de code
Un exemple minimal pour demander et acheter un produit :
import StoreKit
class StoreManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
static let shared = StoreManager()
private var products: [SKProduct] = []
override private init() {
super.init()
SKPaymentQueue.default().add(self)
}
// 1. Demande des produits
func fetchProducts(productIDs: Set<String>) {
let request = SKProductsRequest(productIdentifiers: productIDs)
request.delegate = self
request.start()
}
// 2. Délégué de réception des produits
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
self.products = response.products
for product in products {
print("Produit trouvé : \(product.localizedTitle) — \(product.price)")
}
}
// 3. Achat
func purchase(product: SKProduct) {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
}
// 4. Gestion des transactions
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchased:
// Débloquer le contenu
print("Achat réussi : \(transaction.payment.productIdentifier)")
SKPaymentQueue.default().finishTransaction(transaction)
case .failed:
if let error = transaction.error {
print("Erreur d'achat : \(error.localizedDescription)")
}
SKPaymentQueue.default().finishTransaction(transaction)
case .restored:
print("Achat restauré")
SKPaymentQueue.default().finishTransaction(transaction)