Compras en la aplicación en iOS con Swift 3

Lo que vas a crear

Introducción

La compra desde la aplicación es una gran característica para todos aquellos desarrolladores que desean obtener más ingresos y ofrecer contenido y funciones adicionales a través de sus aplicaciones. Por ejemplo, para juegos puedes comprar gemas o monedas, y para aplicaciones de fotografía puedes desbloquear nuevos efectos o herramientas. Y puede hacer todo esto utilizando una tarjeta de crédito u otro método de pago, sin salir de la aplicación.. 

En este tutorial cubriré todos los pasos necesarios para crear un Consumible y No consumible Producto IAP en iTunes Connect, y le mostraré el código que necesitará para comprar ambos artículos. He realizado un proyecto de muestra de Xcode con una etiqueta y dos botones, así que descárguelo y siga este tutorial para comprender cómo funciona..

Crear un probador de sandbox en iTunes Connect

Supongo que ya has creado una aplicación iOS en el Mis aplicaciones sección en iTunes Connect. Lo primero que debes hacer es crear un Probador de caja de arena para probar IAP en su dispositivo real (no Simulator-it no admite compras dentro de la aplicación). 

Entrar Usuarios y roles, Ve a la Probador de caja de arena y haga clic en la+) firmar junto a Ensayador.

Rellene el formulario para agregar un nuevo probador de sandbox. Una vez que hayas guardado tu información, vuelve a la Mi app y haga clic en el ícono de su aplicación para ingresar sus detalles y crear productos IAP.

Crea productos IAP en iTunes Connect

Productos consumibles

Haga clic en el Caracteristicas pestaña y luego la (+) firmar junto a Compras en la aplicación. Puede crear un producto a la vez, así que comencemos con un Consumible uno.

UNA Consumible IAP, como su nombre lo indica, es un producto que puede comprar varias veces. Lo usaremos para recolectar "monedas" adicionales en nuestra aplicación de demostración. 

Hacer clic Crear para inicializar su elemento IAP. En la siguiente pantalla, puede configurar toda la información sobre su producto:

  • nombre de referencia: este nombre se utilizará en iTunes Connect y en Ventas y Tendencias informes. No se mostrará en la App Store y puede escribir el nombre que desee, pero no puede tener más de 64 caracteres..
  • identificación de producto: Un identificador alfanumérico único que la aplicación buscará para reconocer su producto. Por lo general, los desarrolladores utilizan una sintaxis inversa a la web para los identificadores de producto En este ejemplo elegimos com.iaptutorial.coins. Más adelante pegaremos este ID como una cadena en nuestro código.
  • Precio: Elija un nivel de precios en el menú desplegable. Recuerde que para poder vender su producto de compra en la aplicación en la App Store, debe haber solicitado un Acuerdo de Solicitud de Pago en el Convenios, Impuestos y Banca sección.
  • Localizaciones: Por este tutorial, solo hemos elegido el inglés, pero puede agregar más idiomas haciendo clic en (+) botón Entonces escribe un Nombre para mostrar y un Descripción. Ambos serán visibles en la App Store.. 
  • Captura de pantalla: Subir una captura de pantalla para su revisión. No se mostrará en la App Store y debe tener un tamaño válido para su plataforma de aplicaciones, por lo que si su aplicación es Universal, puede subir una captura de pantalla de iPad.
  • Notas de revisión: Cualquier información adicional sobre su IAP que pueda ser útil para el revisor.

Una vez que hayas terminado, haz clic en Salvar y obtendrás esta alerta:

Su primera compra en la aplicación debe enviarse con una nueva versión de la aplicación. Selecciónelo en la sección de compras integradas de la aplicación y haga clic en Enviar.

Productos no consumibles

Ahora haga clic en el botón Compras dentro de la aplicación en la lista a la izquierda, justo arriba de la Centro de juegos botón, y añadir un nuevo producto IAP. Esta vez, seleccione la No consumible opción:

Hacer clic Crear y repita los pasos que mencionamos anteriormente. Ya que esta será una No consumible producto, los usuarios podrán comprarlo solo una vez, y Apple requiere la capacidad de restaurar dichas compras. Eso sucede en caso de que desinstales la aplicación y la vuelvas a instalar, o la descargues de otro dispositivo con tu misma ID de Apple y necesites recuperar tus compras sin pagarlas dos veces. Así que más tarde añadiremos una Restaurar Compra funciona en nuestro código.

La identificación del producto que creamos ahora es com.iaptutorial.premium, con un nivel de precios de USD $ 2.99. Lo hemos llamado Desbloquear la versión Premium.

Una vez que haya terminado de llenar todos los campos, guarde su producto y vuelva a la página de compras dentro de la aplicación. Ahora debería tener una lista de sus dos productos, con sus Nombre, Tipo, CARNÉ DE IDENTIDAD y Estado establecer como Listo para enviar.

Vuelve a la página de tu aplicación haciendo clic en Tienda de aplicaciones y Prepararse para la sumisión botones. Desplácese hasta la Compras en la aplicación sección, justo debajo Información general de la aplicación, y haga clic en el (+) botón para agregar sus productos IAP. 

Seleccione todos ellos y haga clic en Hecho.

Por último, haga clic en Salvar en la esquina superior derecha de la pantalla, y habrá terminado con la configuración de productos In-App Purchase en iTunes Connect.

Inicie sesión en Sandbox Tester en un dispositivo iOS

Antes de llegar al código, queda una cosa más por hacer. Ir Ajustes > iTunes y App Store en su dispositivo iOS. Si ya ha iniciado sesión con su ID de Apple original, tóquelo y elija Desconectar. Luego simplemente inicie sesión con las credenciales del comprobador de sandbox que creó. Después de iniciar sesión, puede recibir una alerta como esta:

Simplemente ignora su mensaje y toca Cancelar. Su dispositivo le pedirá sus credenciales de inicio de sesión de sandbox nuevamente mientras intenta realizar una compra y reconocerá su cuenta de prueba para que no se le cobre un centavo en su tarjeta de crédito por cualquier compra que realice.

Salida Ajustes, conecte su dispositivo a su Mac a través del cable USB, y finalmente comencemos a codificar!

El código

Si has descargado nuestro proyecto de demostración, verás que se ha escrito todo el código necesario para la compra desde la aplicación, por lo que si lo ejecutas obtendrás algo como esto:

Si desea probar la aplicación, debe cambiar la Identificador de paquete a su propia identificación De lo contrario, Xcode no le permitirá ejecutar la aplicación en un dispositivo real y la aplicación no reconocerá los dos productos IAP que ha creado..


Entrar ViewController.swift y compruebe el código. En primer lugar, hemos añadido una declaración de importación para StoreKit y los delegados que necesitamos para rastrear las transacciones de pago y las solicitudes de productos..

importar clase StoreKit ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver 

A continuación, hemos declarado algunas vistas que serán útiles..

 / * Vistas * / @IBOutlet debilidad var coinsLabel: UILabel! @IBOutlet weak var premiumLabel: UILabel! @IBOutlet weak var consumibleLabel: UILabel! @IBOutlet weak var nonConsumableLabel: UILabel! 

monedasLabel y premiumLabel Se utilizará para mostrar los resultados de las compras de ambos productos.. etiqueta consumible y nonConsumableLabel mostrará la descripción y el precio de cada producto IAP, los que hemos creado anteriormente en iTunes Connect. 

Ahora es el momento de agregar algunas variables:

/ * Variables * / let COINS_PRODUCT_ID = "com.iaptutorial.coins" let PREMIUM_PRODUCT_ID = "com.iaptutorial.premium" var productID = "" var productsRequest = SKProduct .bool (forKey: "nonConsumablePurchaseMade") var coins = UserDefaults.standard.integer (forKey: "coins") 

Las dos primeras líneas son para recordar nuestras identificaciones de productos. Es importante que esas cadenas coincidan exactamente con las registradas en la sección de compras integradas de iTunes Connect.

  • identificación de producto es una cadena que usaremos más adelante para detectar qué producto elegiremos para comprar.
  • productosSolicitud es una instancia de SKProductsRequest, necesario para buscar productos IAP desde su aplicación en iTC.
  • iapProducts es una matriz simple de SKProductos. Tenga en cuenta que el prefijo SK significa StoreKit, el marco de iOS que usaremos para gestionar las compras..

Las dos últimas líneas cargan dos variables de tipo. Booleano y Entero necesario para realizar un seguimiento de las compras de monedas y la versión premium, respectivamente productos consumibles y no consumibles.

El siguiente código en viewDidLoad () realiza algunas cosas tan pronto como se inicia la aplicación:

 // Verifique su impresión de compras en la aplicación ("COMPRA NO CONSUMIBLE HECHA: \ (nonConsumablePurchaseMade)") print ("MONEDAS: \ (monedas)") // Establecer texto coinsLabel.text = "MONEDAS: \ (monedas)" si nonConsumablePurchaseMade premiumLabel.text = "Versión premium COMPRADO!"  else premiumLabel.text = "Versión premium BLOQUEADA!" // Fetch IAP Products available fetchAvailableProducts ()

Primero solo registramos cada compra en la consola Xcode. Luego mostramos la cantidad total de monedas que compramos con el monedasLabel. Ya que estamos ejecutando la aplicación de demostración por primera vez, mostrará MONEDAS: 0.

los Si declaración establece el premiumLabelEl texto de acuerdo a si el producto no consumible fue comprado. Para empezar, se mostrará Versión premium BLOQUEADA! ya que todavía no hemos hecho la compra premium.

La última línea de código llama a un método que veremos más adelante, que simplemente recupera los productos que hemos almacenado previamente en iTC.

Ahora veamos qué hacen los dos botones de compra que hemos establecido en nuestra aplicación de demostración:

// MARCAR: - COMPRAR EL BOTÓN 10 MONEDAS @IBAction func buy10coinsButt (_ sender: Any) purchaseMyProduct (product: iapProducts [0]) // MARK: - UNLOCK PREMIUM BUTTON @IBAction func unlockPremiumButt (_ sender: Any) purchaseMyProduct (producto: iapProducts [1])

Ambos métodos llamarán a una función que verificará si el dispositivo puede realizar compras, y si puede, la aplicación llamará a los métodos de delegado de StoreKit para procesar la compra..

Como se mencionó anteriormente, necesitamos un tercer botón para restaurar nuestra compra no consumible. Aquí está su código:

// MARCA: - Restaurar no consumible @IBAction del botón de compra func restorePurchaseButt (_ remitente: Cualquier) .. SKPaymentQueue.default () Añadir (auto-) SKPaymentQueue.default () restoreCompletedTransactions () func paymentQueueRestoreCompletedTransactionsFinished (_ cola: SKPaymentQueue) nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") UIAlertView (título: "IAP Tutorial", mensaje: "¡Ha restaurado su compra con éxito!", delegado: nil, cancelbuttontitle " .show()  

los IBAcción la función está asociada a la Restaurar Compra botón en el Guión gráfico y comienza a conectarse al sistema In-App Purchase de Apple para restaurar la compra si ya se ha realizado..

paymentQueueRestoreCompletedTransactionsFinished () es el método de delegado del marco de StoreKit que salvará nuestra nonConsumablePurchaseMade variable a verdadero después de que la compra haya sido restaurada exitosamente.

Hemos terminado con los botones, así que vamos a ver qué fetchAvailableProducts () la función hace:

// MARK: - FETCH AVAILABLE IAP PRODUCTS func fetchAvailableProducts () // Ponga aquí su ID de productos IAP let productIdentifiers = NSSet (objetos: COINS_PRODUCT_ID, PREMIUM_PRODUCT_ID) productsRequest = SKProductsRequest (productIdentifiers: productIdentifiers!!!) productsRequest.delegate = self productsRequest.start () 

Primero creamos una instancia de NSSet, que es básicamente una serie de cadenas. Almacenaremos las dos ID de productos que previamente hemos declarado allí..

Entonces comenzamos un SKProductsRequest basado en esos identificadores, para que la aplicación muestre la información sobre los productos IAP (descripción y precio), que será procesada por este método de delegado:

// MARCAR: - SOLICITAR PRODUCTOS IAP func productsRequest (_ solicitud: SKProductsRequest, didReceive response: SKProductsResponse) if (response.products.count> 0) iapProducts = response.products // 1st IAP Product (Consumible) ---- -------------------------------- let firstProduct = response.products [0] as SKProduct // Obtenga su precio de iTunes Conectar let numberFormatter = NumberFormatter () numberFormatter.formatterBehavior = .behavior10_4 numberFormatter.numberStyle = .currency numberFormatter.locale = firstProduct.priceLocale propiedad de los servicios de los menores de edad. localizedDescription + "\ nfor just \ (price1Str!)" // ------------------------------------ ------------ // 2do producto IAP (no consumible) ---------------------------- - deje a secondProd = response.products [1] como SKProduct // obtenga su precio de iTunes Connect numberFormatter.locale = secondProd.priceLocale let price2Str = numberFormatter.string ( from: secondProd.price) // Mostrar su descripción nonConsumableLabel.text = secondProd.localizedDescription + "\ nfor just \ (price2Str!)" // ------------------- ----------------- 

En la función anterior, primero tenemos que comprobar si hay productos registrados en iTunes Connect y configurar nuestros iapProducts arreglo en consecuencia. Entonces podemos inicializar los dos SKProductos e imprimir su descripción y precio en las etiquetas..

Antes de llegar al núcleo del código de compra en la aplicación, necesitamos un par de funciones más:

// MARCAR: - HACER LA COMPRA DE UN PRODUCTO 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 ("PRODUCTO A COMPRA: \ (product.productIdentifier)") productID = product.productIdentifier // IAP Compras dsabled en el Dispositivo else  UIAlertView (título: "IAP Tutorial", mensaje: "¡Las compras están deshabilitadas en su dispositivo!", Delegado: nil, cancelButtonTitle: "OK"). Show () 

La primera comprueba si nuestro dispositivo es capaz de realizar compras. La segunda función es la que llamamos desde los dos botones. Comienza la cola de pago y cambia nuestra identificación de producto variable en el seleccionado Identificador de Producto

Ahora finalmente hemos llegado al último método de delegado, el que maneja los resultados de pago:

// MARCAR: - IAP PAYMENT QUEUE function PAGUEUE PAGUE (_ cola: SKPaymentQueue, updated Transactions transacciones: [SKPaymentTransaction]) para la transacción: AnyObject en las transacciones if let trans = transaction as? SKPaymentTransaction switch trans.transactionState case .purchased: SKPaymentQueue.default (). FinishTransaction (transacción como! SKPaymentTransaction) // ¡El producto consumible (10 monedas) se compró -> obtenga 10 monedas adicionales! Si productID == COINS_PRODUCT_ID // Agregue 10 monedas y ahorre la cantidad total de monedas + = 10 UserDefaults.standard.set (coins, forKey: "coins") coinsLabel.text = "COINS: \ (coins)" UIAlertView (título: "Tutorial de IAP", mensaje: "¡Has comprado exitosamente 10 monedas extra!", Delegado: nil, cancelButtonTitle: "OK"). Show () // ¡El producto No Consumible (Premium) ha sido comprado!  else if productID == PREMIUM_PRODUCT_ID // Guarde su compra localmente (necesaria solo para IAP no consumible) nonConsumablePurchaseMade = true UserDefaults.standard.set (nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") premiumLabeliquia = "Premium version Punk! UIAlertView (título: "IAP Tutorial", mensaje: "¡Has desbloqueado correctamente la versión Premium!", Delegado: nil, cancelButtonTitle: "OK"). Show () break case .failed: SKPaymentQueue.default (). FinishTransaction (transacción como! SKPaymentTransaction) caso de interrupción. restablecido: SKPaymentQueue.default (). finishTransaction (transacción como! SKPaymentTransaction) predeterminado de la interrupción: break

Esta función tiene una cambiar Declaración que verifica cada estado del pago. El primero caso se llama si la compra se ha realizado con éxito y completa su transacción. 

Dentro de este bloque, tenemos que verificar qué ID de producto hemos seleccionado y realizar las acciones necesarias para actualizar nuestra aplicación. Si el usuario compró 10 monedas adicionales, agregaremos 10 a nuestra monedas variable, guarda su valor con UserDefaults, muestra la nueva cantidad de monedas que ganamos y dispara una alerta al respecto. 

Tenga en cuenta que puede realizar esta compra varias veces sin límites, ya que es un IAP consumible, y no hay necesidad de una función de compra de restauración.

Del mismo modo, si compramos el producto premium no consumible, la aplicación establece nuestra nonConsumablePurchaseMade variable a cierto, Guarda, cambia el texto del premiumLabel, y dispara una alerta para notificarle que la compra ha sido exitosa. 

Los otros dos casos Manejar los resultados de pago por fallo y restauración. La aplicación activará alertas personalizadas por sí sola si su transacción falla por algún motivo o si ha restaurado una compra no consumible.

¡Eso es! Ahora solo asegúrese de iniciar sesión con sus credenciales de Sandbox Tester y ejecute la aplicación para probarla. La primera vez, obtendrás una alerta como esta:

Escoger Usar ID de Apple existente e ingrese nuevamente el nombre de usuario y la contraseña de su Sandbox Tester para iniciar sesión. Esto sucede porque la aplicación solo puede reconocer a un usuario real del iTunes y App Store configuración, no una caja de arena uno.

Una vez que haya iniciado sesión, podrá realizar compras de ambos productos.

CodeCanyon Templates

Si trabaja con iOS y desea profundizar en el desarrollo de aplicaciones y lenguaje Swift, consulte algunas de mis plantillas de aplicaciones iOS en CodeCanyon. 

También hay cientos de otras plantillas de aplicaciones de iOS en el mercado de Envato, listas para ser rediseñadas y que acelerarán su flujo de trabajo. Ve a verlos! Puede que solo ahorre horas de trabajo en su próxima aplicación.

Conclusión

En este tutorial, hemos cubierto todos los pasos necesarios para crear productos In-App Purchase en iTunes Connect y cómo escribir el código para habilitarlos en su aplicación. Espero que puedas utilizar este conocimiento en tu próxima aplicación de iOS!

Gracias por leer, y nos vemos la próxima vez! Por favor, consulte nuestros otros cursos y tutoriales sobre el desarrollo de aplicaciones iOS con Swift.