web-dev-qa-db-fra.com

achat in-app en Swift avec un seul produit

Existe-t-il un moyen simple de mettre en œuvre un achat via l'application dans Swift pour un seul produit?

Je veux un bouton qui déclenche l'achat dans l'application comme un [suppression d'annonce] ou [déverrouiller-contenu premium]

Je ne peux pas en comprendre toute la logique.

J'essaie de suivre et de traduire ce tutoriel de [Techotopia] http://www.techotopia.com/index.php/An_iOS_7_In-App_Purchase_Tutorial

Mais c'est ma première fois avec le StoreKit Framework, et aussi avec Swift.

Je veux juste connaître la logique de la transaction d'achat in-app avec le Swift Framework StoreKit.

Merci!

24
angeant

Étape 0: dans votre compte iTunes Connect, créez un achat intégré.

Pour les achats uniques, utilisez cette méthode:

  1. Importer
import StoreKit
  1. Se conformer au délégué StoreKit
class YOURViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
  1. Utiliser un utilisateur par défaut pour suivre les transactions
let defaults = NSUserDefaults.standardUserDefaults()
  1. ID produit. Celui-ci sera le même que dans votre achat iTunes Connect dans l'application
var product_id: NSString?

override func viewDidLoad() {        
    product_id = "YOUR_PRODUCT_ID"
    super.viewDidLoad()
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)

    //Check if product is purchased

    if (defaults.boolForKey("purchased")){  
       // Hide a view or show content depends on your requirement
       overlayView.hidden = true     
    } else if (!defaults.boolForKey("stonerPurchased")) {
        print("false")            
    }
}
  1. Déverrouillez le contenu. Il s'agit d'une action de bouton qui initialisera l'achat
@IBAction func unlockAction(sender: AnyObject) {

   print("About to fetch the products")

   // We check that we are allow to make the purchase.
   if (SKPaymentQueue.canMakePayments()) {
        var productID:NSSet = NSSet(object: self.product_id!);
        var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID);
        productsRequest.delegate = self;
        productsRequest.start();
        println("Fetching Products");
    } else {
        print("can't make purchases");
    }    
}
  1. Méthodes d'assistance
func buyProduct(product: SKProduct) {
    println("Sending the Payment Request to Apple");
    var payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment);
}
  1. Déléguer les méthodes pour IAP
func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {

    var count : Int = response.products.count
    if (count>0) {
        var validProducts = response.products
        var validProduct: SKProduct = response.products[0] as SKProduct
        if (validProduct.productIdentifier == self.product_id) {
            print(validProduct.localizedTitle)
            print(validProduct.localizedDescription)
            print(validProduct.price)
            buyProduct(validProduct);
        } else {
            print(validProduct.productIdentifier)
        }
    } else {
        print("nothing")
    }
}    

func request(request: SKRequest!, didFailWithError error: NSError!) {
    print("Error Fetching product information");
}

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)    {
    print("Received Payment Transaction Response from Apple");

    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
            switch trans.transactionState {
            case .Purchased:
                print("Product Purchased");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                defaults.setBool(true , forKey: "purchased")
                overlayView.hidden = true
                break;
            case .Failed:
                print("Purchased Failed");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                break;
            case .Restored:
                print("Already Purchased");
                SKPaymentQueue.defaultQueue().restoreCompletedTransactions()    
            default:
                break;
            }
        }
    }        
}

Swift> 3.

import StoreKit
class YOURVIEWController:UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {

let product_id: NSString = "com.some.inappid" // <!-- Change it to your inapp id

Dans votre viewDidLoad ajoutez

override func viewDidLoad() {
    super.viewDidLoad()
    SKPaymentQueue.default().add(self)

Dans l'action de votre bouton d'achat

@IBAction func buyNowAction(_ sender: UIButton) {


    if (SKPaymentQueue.canMakePayments()) {
        let productID:NSSet = NSSet(array: [self.product_id as NSString]);
        let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>);
        productsRequest.delegate = self;
        productsRequest.start();
        print("Fetching Products");
    } else {
        print("can't make purchases");
    }
}

Action du bouton Dans votre restauration

// MARK: - Restore In App Purchase
    @IBAction func restoreAction(_ sender: UIButton) {

    if (SKPaymentQueue.canMakePayments()) {
        SKPaymentQueue.default().add(self)
        SKPaymentQueue.default().restoreCompletedTransactions()
    } else {
        // show error
    }

}

Ajouter des délégués:

// SKProductRequest Delegate

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {

    print(response.products)
    let count : Int = response.products.count
    if (count>0) {

        let validProduct: SKProduct = response.products[0] as SKProduct
        if (validProduct.productIdentifier == self.product_id as String) {
            print(validProduct.localizedTitle)
            print(validProduct.localizedDescription)
            print(validProduct.price)
            self.buyProduct(product: validProduct)
        } else {
            print(validProduct.productIdentifier)
        }
    } else {
        print("nothing")
    }
}

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{

            self.dismissPurchaseBtn.isEnabled = true
            self.restorePurchaseBtn.isEnabled = true
            self.buyNowBtn.isEnabled = true

            switch trans.transactionState {
            case .purchased:
                print("Product Purchased")
                //Do unlocking etc stuff here in case of new purchase
                SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)

                break;
            case .failed:
                print("Purchased Failed");
                SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
                break;
            case .restored:
                print("Already Purchased")
                //Do unlocking etc stuff here in case of restor

                SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction)
            default:
                break;
            }
        }
    }
}


//If an error occurs, the code will go to this function
    func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
        // Show some alert
    }
55
Saqib Omer

Méthode déléguée d'achat dans l'application:

func buyInApp()
{
    if (SKPaymentQueue.canMakePayments())
    {
        let productID:NSSet = NSSet(object: "com.valueedge.plane_post");
        let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>);
        productsRequest.delegate = self;
        productsRequest.start();
    }
    else
    {
        MBProgressHUD.hideHUDForView(self.view, animated: true)
    }
}

func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse)
{
    let count : Int = response.products.count
    if (count>0)
    {
        let validProduct: SKProduct = response.products[0] as SKProduct

        if (validProduct.productIdentifier == "com.valueedge.plane_post")
        {
            buyProduct(validProduct);
        }
        else
        {
            MBProgressHUD.hideHUDForView(self.view, animated: true)
        }
    }
    else
    {
        MBProgressHUD.hideHUDForView(self.view, animated: true)
    }
}

func buyProduct(product: SKProduct)
{
    let payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment)
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])
{
    for transaction:AnyObject in transactions
    {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction
        {
            switch trans.transactionState
            {
            case .Purchased:
                self.PaymentSuccess("Apple", details: "Apple(In-App)")
                print("In App Payment Success")
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                MBProgressHUD.hideHUDForView(self.view, animated: true)
                break
            case .Failed:
                MBProgressHUD.hideHUDForView(self.view, animated: true)
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)

                let alert = UIAlertController(title: "Planes Only", message: "Payment failed", preferredStyle: .Alert)
                alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: {(action:UIAlertAction!) in
                }))
                self.presentViewController(alert, animated: true, completion: nil)

                break
            case .Restored :
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                MBProgressHUD.hideHUDForView(self.view, animated: true)
                break
            default:
                MBProgressHUD.hideHUDForView(self.view, animated: true)
                break
            }
        }
    }
}

func restore()
{
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
    MBProgressHUD.showHUDAddedTo(self.view, animated: true)
}

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue)
{
    for transact:SKPaymentTransaction in queue.transactions
    {
        if transact.transactionState == SKPaymentTransactionState.Restored
        {
            //let t: SKPaymentTransaction = transact as SKPaymentTransaction
            //let prodID = t.payment.productIdentifier as String
            //restore prodID
            SKPaymentQueue .defaultQueue().finishTransaction(transact)
            MBProgressHUD.hideHUDForView(self.view, animated: true)
        }
    }
}

func paymentQueue(queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: NSError)
{
    for transaction:SKPaymentTransaction  in queue.transactions
    {
        if transaction.transactionState == SKPaymentTransactionState.Restored
        {
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
            MBProgressHUD.hideHUDForView(self.view, animated: true)
            break
        }
    }
    MBProgressHUD.hideHUDForView(self.view, animated: true)
}

func request(request: SKRequest, didFailWithError error: NSError)
{
    MBProgressHUD.hideHUDForView(self.view, animated: true)
}

Dans le bouton de l'application Cliquez sur l'événement:

@IBAction func In_App_Payment_Clicked(sender: AnyObject)
{
    MBProgressHUD.showHUDAddedTo(self.view, animated: true)
    self.buyInApp()
}
5
Jayesh Miruliya

Pour le développement dans l'application d'achat d'applications, même de manière simple, vous devez résoudre les sous-tâches suivantes qui ne concernent pas le codage:

    • Inscrivez-vous en tant que développeur et créez un ID d'application sous https://developer.Apple.com/account/
    • sélectionnez Certificats, ID et profils.
    • sélectionnez Identificateurs> ID d'application, puis cliquez sur + pour créer un nouvel ID d'application.
    • assurez-vous que l'achat intégré est activé pour votre ID d'application.
    • Remplissez l'accord et les informations bancaires. Pour cette connexion à https://itunesconnect.Apple.com/
    • Étape importante - revérifiez la section Accords, Taxes et Opérations bancaires. Tous doivent être remplis. Dans les autres cas, l'achat dans l'application ne fonctionnera pas. Vous obtiendrez une réponse ayant échoué du serveur.
    • Création d'une application dans iTunes Connect. Pour cela, cliquez simplement sur Mes applications bouton sous https://itunesconnect.Apple.com/
    • Création de produits d'achat intégrés. Dans votre cas Consommable ou non consommable. Pour la gestion du code consommable ou non consommable, le code sera similaire.
  1. Créez un ou plusieurs utilisateurs sandbox. Création d'une application dans iTunes Connect. Pour cela, allez simplement sur https://itunesconnect.Apple.com/ cliquez pour sélectionner le bouton Utilisateurs et rôles , puis cliquez sur l'onglet Sandbox Testers. Créez l'utilisateur-> et accédez à l'e-mail de test et confirmez l'utilisateur à partir de l'e-mail!
  2. Pour démarrer le développement et vérifier la connexion entre itunesconnect et votre application , vous pouvez utiliser le simulateur. Mais lorsque vous essayez d'acheter le produit, vous devez utiliser un véritable appareil.
  3. Obligatoire pour l'application ios avec achat in-app d'avoir non seulement bouton d'achat le "restaurer les achats" devrait également être développé. (par exemple dans Android elle n'est pas obligatoire, Android vérifiez-la de manière différente). Dans le cas où l'utilisateur supprime son application et l'installe à nouveau, il voulez restaurer les articles déjà achetés. Pour cela "restaurer les achats" doit être développé.
    • La dernière étape est le développement et les tests, vous pouvez utiliser le didacticiel suivant pour obtenir des exemples utiles sur la façon de mettre en œuvre restaurer le bouton d'achat . - https://www.raywenderlich.com/122144/in-app-purchase-tutorial
    • Écoutez également des vidéos YouTube pour rendre l'achat dans l'application plus clair pour vous - vous pouvez utiliser la vidéo suivante qui est vraiment géniale - https://youtu.be/o3hJ0rY1NNw
    • C'est tout.
2
yaroslavpalamar