Hay una forma sencilla de implementar una compra in-app en swift para un solo producto?

Quiero un botón que activa la compra in-app como un [ad-eliminación] o [desbloquear-contenido-premium]

Yo no puedo entender por completo la lógica de la misma.

Estoy tratando de seguir y traducir este tutorial de [Techotopia] http://www.techotopia.com/index.php/An_iOS_7_In-App_Purchase_Tutorial

Pero Es mi primera vez con el StoreKit Marco, y también con Swift.

Sólo quiero saber la lógica de la compra in-app de la transacción con el Swift StoreKit Marco.

Gracias!

InformationsquelleAutor angeant | 2014-10-07

3 Comentarios

  1. 52

    Paso 0: En su cuenta de iTunes Connect, crear una compra In-App.

    Para las compras, el uso de este método:

    1. De importación
    import StoreKit
    1. Se ajustan a StoreKit Delegado
    class YOURViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
    1. Utiliza un valor predeterminado de usuario para el seguimiento de las transacciones
    let defaults = NSUserDefaults.standardUserDefaults()
    1. ID de producto. Este será el mismo que en su iTunes Connect compra en la aplicación
    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. Desbloquear El Contenido. Este es el botón de acción para inicializar la compra
    @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étodos Auxiliares
    func buyProduct(product: SKProduct) {
        println("Sending the Payment Request to Apple");
        var payment = SKPayment(product: product)
        SKPaymentQueue.defaultQueue().addPayment(payment);
    }
    1. Delegado Métodos para la 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.0

    import StoreKit
    class YOURVIEWController:UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
    let product_id: NSString = "com.some.inappid" // <!-- Change it to your inapp id

    En su viewDidLoad agregar

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

    En el botón de comprar la acción

    @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");
    }
    }

    En el botón Restaurar de la acción

    //MARK: - Restore In App Purchase
        @IBAction func restoreAction(_ sender: UIButton) {
    if (SKPaymentQueue.canMakePayments()) {
    SKPaymentQueue.default().add(self)
    SKPaymentQueue.default().restoreCompletedTransactions()
    } else {
    //show error
        }
    }

    Agregar A Los Delegados:

    //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
        }
    • Hola, como angeant he utilizado tu código. Pero me puse un entorno de prueba y he hecho la compra con la que cuenta, pero cada vez que tengo la Compra de mensaje de Error. Cómo puedo solucionar eso?
    • Se están probando en el dispositivo o en el simulador?
    • Estoy probando en el simulador.
    • Usted necesita para probar el dispositivo. Cierre de sesión de usted id de apple y probar la aplicación. Va a trabajar.
    • Gracias lo voy a intentar.
    • No te olvides de votar :p
    • es esta IAP válido con apple?como apple recomienda poner el observador en el Appdelegate
    • De que depende que un patrón de diseño que están siguiendo. Sí es válido. He presentado apps con este IAP.
    • Esto también impide al usuario el pago utilizando otro dispositivo con el mismo id de apple? Si he pagado en el iPhone, y la he probado en el iPad, va a decir «Ya Adquirido.»?
    • Respuesta corta es sí. Respuesta larga hay diferentes tipos de en las compras de aplicaciones. Si su aplicación es de tipo no-consumible que en ‘paymentQueue la función que usted necesita para implementar la funcionalidad en contra de Caso .Restaurado. (Desbloquear un nivel de una galería, etc). Es muy importante para implementar la funcionalidad de Restauración para no consumibles en las compras de aplicaciones. De lo contrario, Apple va a rechazar su aplicación durante el proceso de revisión.
    • Gracias! Mi juego tiene una sola no consumible de compra y también he implementado el .Restaurado caso. Yo sólo quería asegurarme antes de que estoy totalmente de terminar el juego como compra in-app es todo lo que necesito hacer.
    • Usted puede probar la aplicación y verificación de los registros en contra de cada caso (.Restaurado, .Comprado) mediante sandbox probador. @JozemiteApps
    • buen código.. estoy tratando de que
    • no cumple el protocolo de transactionObserver
    • Agregar todos los métodos necesarios de ‘SKPaymentTransactionObserver’
    • Tengo el mismo código, pero bajo el delegado método #7, debería imprimir nada. El producrs.count es 0. He configurado la compra in-app en iTunes connect.
    • en swift 3 el updateTransactions método ha sido actualizado a: public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) actualización a eso y todos los errores desaparecen
    • No te olvides de quitar la transacción observador .Agregar esta formas demasiado de lo contrario, usted consigue su inapp producto muchas veces .si vienes a comprar otro producto . func paymentQueue(_ cola: SKPaymentQueue, removedTransactions transacciones: [SKPaymentTransaction]) { SKPaymentQueue.predeterminado().retire la(auto) }

  2. 5

    En la aplicación de Purchas delegado Método :

    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)
    }

    De la app en el botón de Clic evento :

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

    Para el desarrollo de la app en la compra de aplicación aun en la simple forma en que usted necesita para resolver siguiente subtareas que no se refieren a la codificación:

      • Registrarse como desarrollador y la creación de un ID de Aplicación en virtud de https://developer.apple.com/account/
      • seleccione Certificados, IDs & Perfiles.
      • seleccionar los Identificadores > Id de Aplicación, y haga clic en + para crear un nuevo ID de Aplicación.
      • asegúrese de que la Compra De la Aplicación está habilitada para su ID de Aplicación.
      • Llenar el acuerdo y la información bancaria. Para que de inicio de sesión para https://itunesconnect.apple.com/
      • Paso importante – doble verificación de los Acuerdos, Fiscal, Bancario y de la sección. Todos ellos deben ser llenadas. En otro caso, se compra en la aplicación no funcionará. Obtendrá respuesta error del servidor.
      • La creación de una App en iTunes Connect. Para que solo haga clic para Mis Aplicaciones botón bajo https://itunesconnect.apple.com/
      • La Creación De La Compra De La Aplicación De Los Productos. En el caso de los Consumibles o no Consumibles. Para la gestión de los Consumibles o no Consumibles código será similar.
    1. Crear una caja de arena de usuario o los usuarios. La creación de una App en iTunes Connect. Para que sólo vaya a https://itunesconnect.apple.com/ haga clic para seleccionar Usuarios y Roles botón, a continuación, haga clic en el recinto de seguridad de los Probadores de la ficha. Crear el usuario-> y vaya al correo de prueba y confirmar usuario de correo electrónico!
    2. Para iniciar el desarrollo y comprobar la conexión entre itunesconnect y su aplicación puede utilizar el simulador. Pero cuando usted va a tratar de comprar el producto que usted necesita para utilizar dispositivo real.
    3. Obligatorio para la aplicación de ios con la compra en la aplicación para tener no sólo botón comprar la «restaurar compras» botón debe ser desarrollado demasiado. (por ejemplo en la app de Android no es obligatorio, Android app comprobar en forma diferente). En caso de que el usuario elimine de su aplicación e instalarla de nuevo él desea restaurar ya las compras de artículos. Para que «restaurar compras» debe ser desarrollado.
      • El último paso es el desarrollo y las pruebas puede utilizar el siguiente tutorial para obtener algún ejemplo útil de cómo implementar restaurar botón de compra de. – https://www.raywenderlich.com/122144/in-app-purchase-tutorial
      • Escuchar también algún vídeo de youtube para hacer la compra en la aplicación más clara para usted – usted puede utilizar el siguiente vídeo, que es realmente grande – https://youtu.be/o3hJ0rY1NNw
      • Que es.

Dejar respuesta

Please enter your comment!
Please enter your name here