programar para eureka desde descargar community cero apple ios swift in-app-purchase storekit

para - programar en ios desde windows



Compra en la aplicaciĆ³n en Swift con un solo producto (3)

¿Existe una forma sencilla de implementar una compra en la aplicación de forma rápida para un solo producto?

Quiero un botón que active la compra en la aplicación como un [eliminación de anuncios] o [contenido-desbloqueo-premium]

No puedo entender la lógica completa de ello.

Estoy intentando 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 StoreKit Framework, y también con Swift.

Solo quiero saber la lógica de la transacción de compra desde la aplicación con Swift StoreKit Framework.

¡Gracias!


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

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

En el botón de aplicación Haga clic en evento:

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


Para el desarrollo de la aplicación de compra de aplicaciones, incluso de forma sencilla, debe resolver las siguientes subtareas que no están relacionadas con la codificación:

    • Regístrese como desarrollador y cree un ID de aplicación en https://developer.apple.com/account/
    • Seleccione Certificados, IDs y Perfiles.
    • seleccione Identificadores> ID de aplicación y haga clic en + para crear un nuevo ID de aplicación.
    • asegúrese de que la compra en la aplicación esté habilitada para su ID de aplicación.
    • Rellene el acuerdo y la información bancaria. Para eso inicie sesión en https://itunesconnect.apple.com/
    • Paso importante : revise dos veces la sección de Acuerdos, Impuestos y Banca. Todos ellos deben ser llenados. En otro caso en la compra de aplicaciones no funcionará. Obtendrá una respuesta fallida del servidor.
    • Creando una aplicación en iTunes Connect. Para eso, simplemente haga clic en el botón Mis aplicaciones en https://itunesconnect.apple.com/
    • Creación de productos de compra en la aplicación. En su caso consumibles o no consumibles. Para la gestión de consumibles o no consumibles, el código será similar.
  1. Crear usuario o usuarios de sandbox. Creando una aplicación en iTunes Connect. Para eso solo vaya a https://itunesconnect.apple.com/ haga clic para seleccionar el botón Usuarios y funciones , luego haga clic en la pestaña Probadores de sandbox. Cree el usuario -> y vaya al correo electrónico de prueba y confirme al 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 intente comprar el producto necesitará usar un dispositivo real.
  3. Obligatorio para la aplicación ios con la compra de la aplicación para no solo tener que comprar el botón "Restaurar compras" también se debe desarrollar. (Por ejemplo, en la aplicación de Android no es obligatorio, la aplicación de Android la verifica de manera diferente). En caso de que si el usuario elimina su aplicación y la vuelve a instalar, desea restaurar los artículos ya comprados. Para eso se deben desarrollar "restaurar compras" .

Paso 0: en tu cuenta de iTunes Connect, crea una compra desde la aplicación.

Para compras individuales, utilice este método:

  1. Importar

import StoreKit

  1. Cumplir con el delegado de StoreKit

class YOURViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {

  1. Utilice un usuario predeterminado para rastrear transacciones

let defaults = NSUserDefaults.standardUserDefaults()

  1. Identificación de producto. Este será el mismo que en tu iTunes Connect en la compra de 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 contenido. Esta es la acción del botón que 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 de ayuda

func buyProduct(product: SKProduct) { println("Sending the Payment Request to Apple"); var payment = SKPayment(product: product) SKPaymentQueue.defaultQueue().addPayment(payment); }

  1. Métodos de delegado para 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 tu botón de compra 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 la acción de su botón Restaurar

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

Añadir 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 }