Achats in-app sous iOS avec Swift 3

Ce que vous allez créer

introduction

L'achat intégré est une fonctionnalité intéressante pour tous les développeurs qui souhaitent générer davantage de revenus et proposer 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 moyen 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 vais vous montrer le code nécessaire pour acheter les deux éléments. J'ai créé un exemple de projet Xcode avec une étiquette et deux boutons. Téléchargez-le et suivez ce tutoriel pour comprendre son fonctionnement..

Créer un testeur de bac à sable 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 Sandbox pour tester l'IAP sur votre appareil réel (pas de Simulator, il ne prend pas en charge les achats intégrés). 

Entrer Utilisateurs et rôles, aller au Testeur Sandbox onglet, et cliquez sur le bouton (+) signe à côté de Testeur.

Remplissez le formulaire pour ajouter un nouveau testeur de sandbox. Une fois que vous avez enregistré vos informations, retournez à la Mon application section 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 Caractéristiques onglet puis le (+) signe à côté de Achats dans l'application. Vous pouvez créer un produit à la fois, alors commençons par un Consommable un.

UNE Consommable Comme son nom l'indique, IAP est un produit que vous pouvez acheter plusieurs fois. Nous allons l'utiliser pour collecter des "pièces" supplémentaires dans notre application de démonstration. 

Cliquez sur Créer pour initialiser votre article 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 du produit: Un identifiant alphanumérique unique qui sera récupéré par l'application afin de reconnaître votre produit. Généralement, les développeurs utilisent une syntaxe inversée Web pour les ID de produit. Dans cet exemple, nous avons choisi com.iaptutorial.coins. Plus tard, nous allons coller 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 intégré à l'App Store, vous devez avoir demandé un Contrat d'application payé dans le Accords, fiscalité et banque section.
  • Les localisations: Pour les besoins de ce tutoriel, nous avons choisi l’anglais seulement, mais vous pouvez ajouter plus de langues en cliquant sur le bouton (+) bouton. Puis tapez un Afficher un nom et un La description. Les deux seront visibles sur l'App Store. 
  • Capture d'écran: Télécharger une capture d'écran pour la revue. Elle ne sera pas affichée dans l'App Store et doit avoir une taille valide pour la plate-forme de votre application. Si votre application est universelle, vous pouvez télécharger une capture d'écran pour iPad..
  • Notes de révision: Toute information supplémentaire sur votre IAP qui pourrait être utile au relecteur.

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 in-app de l'application et cliquez sur Soumettre..

Produits non consommables

Cliquez maintenant sur le bouton Achats intégrés à l’application dans la liste de gauche, juste au-dessus du Centre de jeu bouton 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 devra pouvoir restaurer ces achats. Cela se produit si vous désinstallez et réinstallez l'application, 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. Alors plus tard, nous allons ajouter 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ébloquer la version Premium.

Une fois que vous avez rempli tous les champs, enregistrez votre produit et retournez à la page Achats in-app. Maintenant, vous devriez avoir une liste de vos deux produits, avec leur prénom, Type, ID et Statut définir comme Prêt à soumettre.

Retournez à la page de votre application en cliquant sur le bouton Magasin d'applications et Préparer la soumission boutons. Faites défiler jusqu'à la Achats dans l'application 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 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 intégrés à iTunes Connect.

Connectez-vous à Sandbox Tester sur un périphérique iOS

Avant de passer au code, il reste encore une chose à faire. Aller à Réglages > iTunes et App Store sur votre appareil iOS. Si vous êtes déjà connecté avec votre identifiant Apple original, appuyez dessus et choisissez Déconnexion. Ensuite, connectez-vous simplement avec les informations d'identification du testeur de bac à sable 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 sandbox lors de vos tentatives d’achat et reconnaîtra votre compte test afin que vous ne receviez pas un centime sur votre carte de crédit pour tout achat effectué.

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 à l'achat intégré a été écrit. Par conséquent, si vous l'exécutez, vous obtiendrez un résultat du genre:

Si vous souhaitez tester l'application, vous devez modifier le Identifiant de paquet à votre propre identifiant. Sinon, Xcode ne vous autorisera pas à exécuter l'application sur un périphérique 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.

classe StoreCit import ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver 

Ensuite, nous avons déclaré quelques vues qui seront utiles.

 / * Vues * / @IBOutlet faible var coinsLabel: UILabel! @IBOutlet faible var premiumLabel: UILabel! @IBOutlet faible consommableLabel: UILabel! @IBOutlet faible var nonConsumableLabel: UILabel! 

pièces de monnaie et premiumLabel sera utilisé pour afficher les résultats des achats pour les deux produits. consommableLabel et nonConsumableLabel affiche la description et le prix de chaque produit IAP, ceux 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 = [SKProduct]). .bool (forKey: "nonConsumablePurchaseMade") var coins = UserDefaults.standard.integer (forKey: "coins") 

Les deux premières lignes doivent rappeler nos ID de produit. Il est important que ces chaînes correspondent exactement à celles enregistrées dans la section des achats intégrés à iTunes Connect..

  • productID est une chaîne que nous utiliserons plus tard pour détecter le produit que nous choisirons d'acheter.
  • produitsDemande est un exemple de SKProductsRequest, nécessaire pour rechercher des produits IAP à partir de votre application sur iTC.
  • iapProducts est un simple tableau de SKProduits. 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 Booléen et Entier nécessaires pour suivre les achats de pièces et la version premium, respectivement consommables et non consommables.

Le code suivant dans viewDidLoad () effectue quelques opérations dès le démarrage de l'application:

 // Vérifiez vos achats intégrés dans l'application ("ACHAT NON CONSOMMABLE MADE: \ (nonConsumablePurchaseMade)") print ("COINS: \ (coins)") // Définissez le texte coinsLabel.text = "COINS: \ (coins)" si nonConsumablePurchaseMade premiumLabel.text = "Version Premium ACHETÉ!"  else premiumLabel.text = "Version Premium LOCKED!" // Récupération des produits IAP disponibles fetchAvailableProducts ()

Premièrement, nous connectons chaque achat à la console Xcode. Ensuite, nous affichons le montant total des pièces que nous avons achetées avec le pièces de monnaie. Puisque nous utilisons l'application de démonstration pour la première fois, cela montrera PIECES: 0.

le si déclaration définit la premiumLabelLe texte de selon le produit non consommable a été acheté ou non. Pour commencer, il montrera Version Premium LOCKED! 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 définis dans notre application de démonstration:

// MARK: - BOUTON DE 10 PIÈCES ACHETER @IBAction func buy10coinsButt (_ expéditeur: N'importe lequel) purchaseMyProduct (produit: iapProducts [0]) // MARK: - BOUTON UNLOCK PREMIUM @IBAction func unlockPremiumButt (_ expéditeur: Any) (Purchase). (produit: iapProducts [1])

Les deux méthodes appellent une fonction qui vérifie si l'appareil peut effectuer des achats et, si c'est le cas, l'application appelle les méthodes de délégation StoreKit pour traiter l'achat..

Comme mentionné précédemment, nous avons besoin d'un troisième bouton pour restaurer notre achat non consommable. Voici son code:

// MARQUE: - BOUTON DE RESTAURATION NON CONSOMMABLE RESTORE @IBAction func restorePurchaseButt (_ expéditeur: Any) SKPaymentQueue.default (). nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") UIAlertView (titre: "Tutoriel IAP", message: "Vous avez restauré votre achat!", délégataire: nil, cancelButton:: .spectacle()  

le IBAction la fonction est attachée à la Restaurer l'achat bouton dans le Storyboard et commence à se connecter au système d'achat in-app d'Apple pour restaurer l'achat si cela a déjà été fait.

paymentQueueRestoreCompletedTransactionsFinished () est la méthode de délégation du framework StoreKit qui sauvera notre non-consommable achat variable à true après la restauration de l'achat.

Nous en avons fini avec les boutons, voyons ce que le fetchAvailableProducts () la fonction fait:

// MARK: - FETCH DISPONIBLE PRODUITS IAP func fetchAvailableProducts () // Indiquez ici vos ID de produits IAP. ProductIdentifiers = NSSet (objets: COINS_PRODUCT_ID, PREMIUM_PRODUCT_ID) productsRequest = SKProductsRequest (productIdents: productIdentifiers as!! Product) productsRequest.delegate = self productsRequest.start () 

Nous créons d'abord une instance de NSSet, qui est essentiellement un tableau de chaînes. Nous allons stocker les deux ID de produit que nous avons précédemment déclarés.

Puis on commence un SKProductsRequest sur la base 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 de délégation:

// MARK: - DEMANDEZ LES PRODUITS IAP func productsRequest (_ request: SKProductsRequest, didReceive response: SKProductsResponse) if (response.products.count> 0) iapProducts = response.products // 1er produit IAP (consommable) ---- -------------------------------- let firstProduct = response.products [0] en tant que SKProduct // Obtenir son prix d'iTunes Connectez-vous à numberFormatter = NumberFormatter () numberFormatter.formatterBehavior = .behavior10_4 numberFormatter.numberStyle = .currency numberFormatter.locale = firstProduct.priceLocale laissons price1Str = numberFormatter.string (format) à partir de localizedDescription + "\ nPour juste \ (price1Str!)" // -------------------------------------------- ------------ // 2ème produit IAP (non consommable) ---------------------------- - let secondProd = response.products [1] en tant que SKProduct // Récupère son prix depuis iTunes Connect numberFormatter.locale = secondProd.priceLocale let price2Str = numberFormatter.string ( from: secondProd.price) // Afficher sa 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 imprimer leur description et leur prix sur les étiquettes.

Avant d’entrer au cœur du code d’achat intégré, nous avons besoin de quelques fonctions supplémentaires:

// MARQUE: - FAIRE L'ACHAT D'UN PRODUIT func canMakePurchases () -> Bool return SKPaymentQueue.canMakePayments () func purchaseMyProduct (product: SKProduct) if self.canMakePurchases () func purchase (product: SKPayment (product)). .default (). add (self) SKPaymentQueue.default (). add (payment) print ("PRODUIT À ACHETER: \ (product.productIdentifier)") productID = product.productIdentifier // IAP Achats désactivés sur le périphérique else  UIAlertView (titre: "Didacticiel IAP", message: "Les achats sont désactivés sur votre appareil!", Délégué: 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 commence la file d'attente de paiement et change notre productID variable dans la sélection étiquette d'un produit

Nous arrivons enfin à la dernière méthode de délégation, celle qui gère les résultats de paiement:

// MARQUE: - PAIEMENT PAIEMENT FONCTION de paiementQueue (_ file: SKPaymentQueue, transactions transactionnées: [SKPaymentTransaction]) pour transaction: AnyObject dans les transactions si let trans = transaction as? SKPaymentTransaction switch trans.transactionState cas. Acheté: SKPaymentQueue.default (). FinishTransaction (transaction en tant que! SKPaymentTransaction) // Le produit consommable (10 pièces) a été acheté -> gagnez 10 pièces supplémentaires! si productID == COINS_PRODUCT_ID // Ajoutez 10 pièces et enregistrez leur montant total en pièces + = 10 UserDefaults.standard.set (pièces, pourKey: "pièces") coinsLabel.text = "COINS: \ (pièces)" UIAlertView (titre: "Didacticiel IAP", message: "Vous avez acheté avec succès 10 pièces supplémentaires!", Délégué: nil, cancelButtonTitle: "OK"). Show () // Le produit non consommable (Premium) a été acheté!  else si productID == PREMIUM_PRODUCT_ID // Sauvegardez votre achat localement (requis uniquement pour l'IAP non consommable) nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, pourKey: "nonConsumablePurchaMeMade") premiumlist UIAlertView (titre: "Didacticiel IAP", message: "Vous avez réussi à déverrouiller la version Premium!", Délégué: nil, cancelButtonTitle: "OK"). Show () break case .failed: SKPaymentQueue.default (). FinishTransaction (transaction comme! SKPaymentTransaction) break cas .restored: SKPaymentQueue.default (). finishTransaction (transaction comme! SKPaymentTransaction) break default: break

Cette fonction a un commutateur déclaration qui vérifie chaque état du paiement. La première Cas est appelé si l'achat a été effectué avec succès et termine sa transaction. 

À l'intérieur de 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. Par conséquent, si nous achetions 10 pièces supplémentaires, nous en ajouterions 10. pièces de monnaie variable, enregistrez sa valeur avec UserDefaults, afficher la nouvelle quantité de pièces gagnée et déclencher une alerte. 

Veuillez noter que vous pouvez effectuer cet achat plusieurs fois sans limite puisqu'il s'agit d'un IAP consommable et qu'il n'est pas nécessaire d'utiliser une fonction d'achat de restauration..

De même, si nous achetions le produit premium non consommable, l’application définit notre non-consommable achat variable à vrai, enregistre, modifie le texte du premiumLabel, et déclenche une alerte pour vous informer que l'achat a abouti. 

Les deux autres cas gérer les résultats de paiement en cas d'échec et de restauration. L'application déclenchera seule des alertes personnalisées si votre transaction échoue pour une raison quelconque ou si vous avez restauré un achat non consommable..

C'est tout! Maintenant, assurez-vous simplement 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 ceci:

Choisir Utiliser un identifiant Apple existant et entrez à nouveau le nom d'utilisateur et le mot de passe de votre testeur Sandbox pour vous connecter. Ceci est dû au fait que l'application ne peut reconnaître qu'un seul iTunes et App Store paramètres, pas un Sandbox.

Une fois connecté, vous pourrez acheter les deux produits..

Modèles CodeCanyon

Si vous travaillez avec iOS et que vous souhaitez approfondir le développement d'applications et de langages Swift, consultez certains de mes modèles d'applications iOS sur CodeCanyon.. 

Il existe également des centaines de modèles d'applications iOS sur le marché Envato, prêts à être réapprovisionnés et sûrs d'accélérer votre flux de travail. Allez les vérifier! Vous pourriez juste économiser des heures de travail sur votre prochaine application.

Conclusion

Dans ce didacticiel, nous avons décrit toutes les étapes nécessaires à la création de produits d’achat intégré dans iTunes Connect et à la procédure d’écriture du code pour les activer dans votre application. J'espère que vous pourrez utiliser ces connaissances dans votre prochaine application iOS.!

Merci d'avoir lu et à la prochaine fois! Consultez nos autres cours et tutoriels sur le développement d'applications iOS avec Swift.