introduction
L’achat via l’application est une fonctionnalité intéressante pour tous les développeurs qui souhaitent générer plus de revenus et offrir du contenu et des fonctionnalités supplémentaires via leurs applications. Par exemple, pour les jeux, vous pouvez acheter des pierres précieuses ou des pièces de monnaie, et pour les applications de photographie, vous pouvez débloquer de nouveaux effets ou outils. Et vous pouvez faire tout cela en utilisant une carte de crédit ou un autre mode de paiement, sans quitter l’application.
Dans ce tutoriel, je couvrirai toutes les étapes nécessaires pour créer un Consommable et Non consommable Produit IAP sur iTunes Connect, et je vous montrerai le code dont vous aurez besoin pour acheter les deux articles. J’ai fait un exemple de projet Xcode avec une étiquette et deux boutons, alors téléchargez-le et suivez ce tutoriel pour comprendre comment cela fonctionne.
Créer un testeur de sandbox dans iTunes Connect
Je suppose que vous avez déjà créé une application iOS dans le Mes applications section sur iTunes Connect. La première chose à faire est de créer un Testeur de bac à sable pour tester IAP sur votre appareil réel (pas de simulateur – il ne prend pas en charge les achats intégrés).
Entrer Utilisateurs et rôles, allez au Testeur de bac à sable onglet, puis cliquez sur le (+) signe à côté de Testeur.


Remplissez le formulaire pour ajouter un nouveau testeur de bac à sable. Une fois que vous avez enregistré vos informations, revenez à la Mon appli et cliquez sur l’icône de votre application pour entrer ses détails et créer des produits IAP.
Créer des produits IAP dans iTunes Connect
Produits consommables
Clique le traits puis l’onglet (+) signe à côté de Achats intégrés. Vous pouvez créer un produit à la fois, alors commençons par un Consommable un.


UNE Consommable IAP, comme son nom l’indique, est un produit que vous pouvez acheter plusieurs fois. Nous l’utiliserons pour collecter des «pièces» supplémentaires dans notre application de démonstration.
Cliquez sur Créer pour initialiser votre élément IAP. Sur l’écran suivant, vous pouvez configurer toutes les informations sur votre produit:
- Nom de référence: ce nom sera utilisé sur iTunes Connect et dans Ventes et tendances rapports. Il ne sera pas affiché sur l’App Store et vous pouvez taper le nom de votre choix, mais il ne peut pas dépasser 64 caractères.
- ID produit: Un identifiant alphanumérique unique qui sera récupéré par l’application afin de reconnaître votre produit. Les développeurs utilisent généralement une syntaxe inverse Web pour les identifiants de produit. Dans cet exemple, nous avons choisi com.iaptutorial.coins. Plus tard, nous collerons cet identifiant sous forme de chaîne dans notre code.
- Prix: Choisissez un niveau de prix dans le menu déroulant. N’oubliez pas que pour vendre votre produit d’achat via l’application sur l’App Store, vous devez avoir demandé un Contrat d’application payant dans le Accords, fiscalité et banque section.
- Localisations: Pour ce tutoriel, nous n’avons choisi que l’anglais, mais vous pouvez ajouter d’autres langues en cliquant sur le bouton (+) bouton. Tapez ensuite un Afficher un nom et un La description. Les deux seront visibles sur l’App Store.
- Capture d’écran: Téléchargez une capture d’écran pour examen. Il ne sera pas affiché dans l’App Store et il doit avoir une taille valide pour votre plate-forme d’application, donc si votre application est universelle, vous pouvez télécharger une capture d’écran iPad.
- Notes de révision: Toute information supplémentaire sur votre IAP qui peut être utile pour le réviseur.


Une fois que vous avez terminé, cliquez sur sauvegarder et vous recevrez cette alerte:
Votre premier achat intégré doit être soumis avec une nouvelle version de l’application. Sélectionnez-le dans la section Achats intégrés de l’application et cliquez sur Soumettre.
Produits non consommables
Cliquez maintenant sur le bouton Achats intégrés dans la liste de gauche, juste au-dessus du Centre de jeu et ajoutez un nouveau produit IAP. Cette fois, sélectionnez le Non consommable option:


Cliquez sur Créer et répétez les étapes mentionnées ci-dessus. Puisque ce sera un Non consommable produit, les utilisateurs ne pourront l’acheter qu’une seule fois et Apple a besoin de la possibilité de restaurer ces achats. Cela se produit au cas où vous désinstallez l’application et la réinstallez à nouveau, ou si vous la téléchargez à partir d’un autre appareil avec votre même identifiant Apple et que vous devez récupérer vos achats sans les payer deux fois. Donc plus tard, nous ajouterons un Restaurer l’achat fonction dans notre code.
L’ID de produit que nous avons créé maintenant est com.iaptutorial.premium, avec un niveau de prix de 2,99 USD. Nous l’avons appelé Débloquez la version Premium.
Une fois que vous avez terminé de remplir tous les champs, enregistrez votre produit et revenez à la page Achats intégrés. Vous devriez maintenant avoir une liste de vos deux produits, avec leur Nom, Type, ID et Statut définir comme Prêt à soumettre.


Revenez sur la page de votre application en cliquant sur le Magasin d’applications et Préparez-vous à la soumission boutons. Faites défiler vers le bas Achats intégrés section, juste en dessous Informations générales sur l’application, et cliquez sur le (+) bouton pour ajouter vos produits IAP.


Sélectionnez-les tous et cliquez sur Terminé.


Enfin, cliquez sur sauvegarder dans le coin supérieur droit de l’écran et vous aurez terminé avec la configuration des produits d’achat dans l’application sur iTunes Connect.
Connectez-vous à Sandbox Tester sur un appareil iOS
Avant de passer au code, il reste une chose à faire. Aller à Réglages > iTunes et App Store sur votre appareil iOS. Si vous êtes déjà connecté avec votre identifiant Apple d’origine, appuyez dessus et choisissez Déconnexion. Ensuite, connectez-vous simplement avec les informations d’identification du testeur de sandbox que vous avez créé. Une fois connecté, vous pouvez recevoir une alerte comme celle-ci:
Ignorez simplement son message et appuyez sur Annuler. Votre appareil vous demandera à nouveau vos identifiants de connexion au bac à sable tout en essayant de faire un achat et reconnaîtra votre compte de test afin que vous ne soyez pas débité d’un centime sur votre carte de crédit pour tout achat que vous effectuez.
Sortie Réglages, branchez votre appareil sur votre Mac via le câble USB, et commençons enfin à coder!
Le code
Si vous avez téléchargé notre projet de démonstration, vous verrez que tout le code nécessaire pour l’achat intégré a été écrit, donc si vous l’exécutez, vous obtiendrez quelque chose comme ceci:
Si vous souhaitez tester l’application, vous devez modifier le Identifiant du bundle à votre propre identité. Sinon, Xcode ne vous permettra pas d’exécuter l’application sur un appareil réel et l’application ne reconnaîtra pas les deux produits IAP que vous avez créés.
Entrer ViewController.swift et vérifiez le code. Tout d’abord, nous avons ajouté une déclaration d’importation pour StoreKit
et les délégués dont nous avons besoin pour suivre les transactions de paiement et les demandes de produits.
import StoreKit class ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
Ensuite, nous avons déclaré quelques vues qui seront utiles.
/* Views */ @IBOutlet weak var coinsLabel: UILabel! @IBOutlet weak var premiumLabel: UILabel! @IBOutlet weak var consumableLabel: UILabel! @IBOutlet weak var nonConsumableLabel: UILabel!
coinsLabel
et premiumLabel
sera utilisé pour afficher les résultats des achats pour les deux produits. consumableLabel
et nonConsumableLabel
affichera la description et le prix de chaque produit IAP, ceux que nous avons précédemment créés dans iTunes Connect.
Il est maintenant temps d’ajouter quelques variables:
/* Variables */ let COINS_PRODUCT_ID = "com.iaptutorial.coins" let PREMIUM_PRODUCT_ID = "com.iaptutorial.premium" var productID = "" var productsRequest = SKProductsRequest() var iapProducts = [SKProduct]() var nonConsumablePurchaseMade = UserDefaults.standard.bool(forKey: "nonConsumablePurchaseMade") var coins = UserDefaults.standard.integer(forKey: "coins")
Les deux premières lignes permettent de rappeler nos identifiants de produits. Il est important que ces chaînes correspondent exactement à celles enregistrées dans la section Achat In-App d’iTunes Connect.
-
productID
est une chaîne que nous utiliserons plus tard pour détecter le produit que nous choisirons d’acheter. -
productsRequest
est une instance deSKProductsRequest
, nécessaire pour rechercher des produits IAP à partir de votre application sur iTC. -
iapProducts
est un simple tableau deSKProducts
. Veuillez noter que le préfixe SK signifie StoreKit, le framework iOS que nous utiliserons pour gérer les achats.
Les deux dernières lignes chargent deux variables de type Boolean
et Integer
nécessaires pour suivre les achats de pièces et de la version premium, respectivement des produits consommables et non consommables.
Le code suivant dans viewDidLoad()
effectue quelques opérations dès le démarrage de l’application:
// Check your In-App Purchases print("NON CONSUMABLE PURCHASE MADE: (nonConsumablePurchaseMade)") print("COINS: (coins)") // Set text coinsLabel.text = "COINS: (coins)" if nonConsumablePurchaseMade { premiumLabel.text = "Premium version PURCHASED!" } else { premiumLabel.text = "Premium version LOCKED!"} // Fetch IAP Products available fetchAvailableProducts()
Tout d’abord, nous enregistrons simplement chaque achat sur la console Xcode. Ensuite, nous affichons le montant total des pièces que nous avons achetées avec le coinsLabel
. Puisque nous exécutons l’application de démonstration pour la première fois, elle affichera PIÈCES: 0.
le if
instruction définit le premiumLabel
le texte selon que le produit non consommable a été acheté. Pour commencer, il montrera Version Premium VERROUILLÉE! puisque nous n’avons pas encore effectué l’achat premium.
La dernière ligne de code appelle une méthode que nous verrons plus tard, qui récupère simplement les produits que nous avons précédemment stockés dans iTC.
Voyons maintenant ce que font les deux boutons d’achat que nous avons définis dans notre application de démonstration:
// MARK: - BUY 10 COINS BUTTON @IBAction func buy10coinsButt(_ sender: Any) { purchaseMyProduct(product: iapProducts[0]) } // MARK: - UNLOCK PREMIUM BUTTON @IBAction func unlockPremiumButt(_ sender: Any) { purchaseMyProduct(product: iapProducts[1]) }
Les deux méthodes appelleront une fonction qui vérifiera si l’appareil peut effectuer des achats, et si elle le peut, l’application appellera les méthodes de délégué StoreKit pour traiter l’achat.
Comme mentionné précédemment, nous avons besoin d’un troisième bouton pour restaurer notre achat de non-consommables. Voici son code:
// MARK: - RESTORE NON-CONSUMABLE PURCHASE BUTTON @IBAction func restorePurchaseButt(_ sender: Any) { SKPaymentQueue.default().add(self) SKPaymentQueue.default().restoreCompletedTransactions() } func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { nonConsumablePurchaseMade = true UserDefaults.standard.set(nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") UIAlertView(title: "IAP Tutorial", message: "You've successfully restored your purchase!", delegate: nil, cancelButtonTitle: "OK").show() }
le IBAction
la fonction est attachée au Restaurer l’achat bouton dans le Storyboard et commence à se connecter au système d’achat intégré d’Apple pour restaurer l’achat s’il a déjà été effectué.
paymentQueueRestoreCompletedTransactionsFinished()
est la méthode déléguée du framework StoreKit qui sauvera notre nonConsumablePurchaseMade
variable à true une fois que l’achat a été restauré avec succès.
Nous en avons fini avec les boutons, voyons ce que fetchAvailableProducts()
la fonction fait:
// MARK: - FETCH AVAILABLE IAP PRODUCTS func fetchAvailableProducts() { // Put here your IAP Products ID's let productIdentifiers = NSSet(objects: COINS_PRODUCT_ID, PREMIUM_PRODUCT_ID ) productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>) productsRequest.delegate = self productsRequest.start() }
Nous créons d’abord une instance de NSSet
, qui est essentiellement un tableau de chaînes. Nous y stockerons les deux ID de produit que nous avons précédemment déclarés.
Ensuite, nous commençons un SKProductsRequest
en fonction de ces identifiants, afin que l’application affiche les informations sur les produits IAP (description et prix), qui seront traitées par cette méthode déléguée:
// MARK: - REQUEST IAP PRODUCTS func productsRequest (_ request:SKProductsRequest, didReceive response:SKProductsResponse) { if (response.products.count > 0) { iapProducts = response.products // 1st IAP Product (Consumable) ------------------------------------ let firstProduct = response.products[0] as SKProduct // Get its price from iTunes Connect let numberFormatter = NumberFormatter() numberFormatter.formatterBehavior = .behavior10_4 numberFormatter.numberStyle = .currency numberFormatter.locale = firstProduct.priceLocale let price1Str = numberFormatter.string(from: firstProduct.price) // Show its description consumableLabel.text = firstProduct.localizedDescription + "nfor just (price1Str!)" // ------------------------------------------------ // 2nd IAP Product (Non-Consumable) ------------------------------ let secondProd = response.products[1] as SKProduct // Get its price from iTunes Connect numberFormatter.locale = secondProd.priceLocale let price2Str = numberFormatter.string(from: secondProd.price) // Show its description nonConsumableLabel.text = secondProd.localizedDescription + "nfor just (price2Str!)" // ------------------------------------ } }
Dans la fonction ci-dessus, nous devons d’abord vérifier s’il existe des produits enregistrés dans iTunes Connect et définir notre iapProducts
tableau en conséquence. Ensuite, nous pouvons initialiser les deux SKProduits et imprimez leur description et leur prix sur les étiquettes.
Avant de passer au cœur du code d’achat intégré à l’application, nous avons besoin de quelques fonctions supplémentaires:
// MARK: - MAKE PURCHASE OF A PRODUCT func canMakePurchases() -> Bool { return SKPaymentQueue.canMakePayments() } func purchaseMyProduct(product: SKProduct) { if self.canMakePurchases() { let payment = SKPayment(product: product) SKPaymentQueue.default().add(self) SKPaymentQueue.default().add(payment) print("PRODUCT TO PURCHASE: (product.productIdentifier)") productID = product.productIdentifier // IAP Purchases dsabled on the Device } else { UIAlertView(title: "IAP Tutorial", message: "Purchases are disabled in your device!", delegate: nil, cancelButtonTitle: "OK").show() } }
Le premier vérifie si notre appareil est capable de faire des achats. La deuxième fonction est celle que nous appelons à partir des deux boutons. Il démarre la file d’attente de paiement et modifie notre productID
variable dans la sélection productIdentifier
.
Nous sommes enfin arrivés à la dernière méthode de délégué, celle qui gère les résultats des paiements:
// MARK:- IAP PAYMENT QUEUE func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction:AnyObject in transactions { if let trans = transaction as? SKPaymentTransaction { switch trans.transactionState { case .purchased: SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) // The Consumable product (10 coins) has been purchased -> gain 10 extra coins! if productID == COINS_PRODUCT_ID { // Add 10 coins and save their total amount coins += 10 UserDefaults.standard.set(coins, forKey: "coins") coinsLabel.text = "COINS: (coins)" UIAlertView(title: "IAP Tutorial", message: "You've successfully bought 10 extra coins!", delegate: nil, cancelButtonTitle: "OK").show() // The Non-Consumable product (Premium) has been purchased! } else if productID == PREMIUM_PRODUCT_ID { // Save your purchase locally (needed only for Non-Consumable IAP) nonConsumablePurchaseMade = true UserDefaults.standard.set(nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") premiumLabel.text = "Premium version PURCHASED!" UIAlertView(title: "IAP Tutorial", message: "You've successfully unlocked the Premium version!", delegate: nil, cancelButtonTitle: "OK").show() } break case .failed: SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) break case .restored: SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) break default: break }}} }
Cette fonction a un switch
relevé qui vérifie chaque état du paiement. La première case
est appelé si l’achat a été effectué avec succès et termine sa transaction.
Dans ce bloc, nous devons vérifier l’ID de produit que nous avons sélectionné et effectuer les actions nécessaires pour mettre à jour notre application. Donc, si nous, l’utilisateur, avons acheté 10 pièces supplémentaires, nous en ajouterons 10 à notre coins
variable, enregistrez sa valeur avec UserDefaults
, affichez la nouvelle quantité de pièces que nous avons gagnées et déclenchez une alerte à ce sujet.
Veuillez noter que vous pouvez effectuer cet achat plusieurs fois sans aucune limite, car il s’agit d’un IAP consommable, et aucune fonction d’achat de restauration n’est nécessaire.
De même, si nous avons acheté le produit premium non consommable, l’application définit notre nonConsumablePurchaseMade
variable à true
, l’enregistre, modifie le texte du premiumLabel
, et déclenche une alerte pour vous informer que l’achat a réussi.
Les deux autres cases
gérer les résultats de paiement en cas d’échec et de restauration. L’application déclenchera elle-même des alertes personnalisées si votre transaction échoue pour une raison quelconque ou si vous avez restauré un achat non consommable.
C’est ça! Maintenant, assurez-vous que vous êtes connecté avec vos informations d’identification Sandbox Tester et exécutez l’application pour la tester. La première fois, vous recevrez une alerte comme celle-ci:
Choisir Utiliser l’identifiant Apple existant et saisissez à nouveau le nom d’utilisateur et le mot de passe de votre Sandbox Tester pour vous connecter. Cela se produit car l’application ne peut reconnaître qu’un utilisateur réel du iTunes et App Store paramètres, pas un Sandbox.
Une fois connecté, vous pourrez effectuer des achats des deux produits.




Modèles CodeCanyon
Si vous travaillez avec iOS et souhaitez approfondir le développement du langage et des applications Swift, consultez quelques-uns des mes modèles d’application iOS sur CodeCanyon.
Il y a des centaines d’autres Modèles d’applications iOS sur le marché Envato ainsi, prêt à être réaménagé et sûr d’accélérer votre flux de travail. Allez les voir! Vous pourriez économiser des heures de travail sur votre prochaine application.
Conclusion
Dans ce didacticiel, nous avons couvert toutes les étapes nécessaires pour créer des produits d’achat intégré sur iTunes Connect et comment écrire le code pour les activer dans votre application. J’espère que vous pourrez mettre ces connaissances à profit dans votre prochaine application iOS!
Merci d’avoir lu et à la prochaine fois! Veuillez consulter nos autres cours et tutoriels sur le développement d’applications iOS avec Swift.
Laisser un commentaire