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.
- 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!
- 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.
- 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" .
- El último paso es el desarrollo y las pruebas; puede usar el siguiente tutorial para obtener un ejemplo útil de cómo implementar el botón de restauración de compra . - https://www.raywenderlich.com/122144/in-app-purchase-tutorial
- También escuche algunos videos de YouTube para que la compra de la aplicación sea más clara para usted; puede usar el siguiente video, que es realmente genial: https://youtu.be/o3hJ0rY1NNw
- Eso es.
Paso 0: en tu cuenta de iTunes Connect, crea una compra desde la aplicación.
Para compras individuales, utilice este método:
- Importar
import StoreKit
- Cumplir con el delegado de StoreKit
class YOURViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
- Utilice un usuario predeterminado para rastrear transacciones
let defaults = NSUserDefaults.standardUserDefaults()
- 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")
}
}
- 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");
}
}
- Métodos de ayuda
func buyProduct(product: SKProduct) {
println("Sending the Payment Request to Apple");
var payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addPayment(payment);
}
- 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
}