iOS: compra desde la aplicación

La compra desde la aplicación se utiliza para comprar contenido adicional o actualizar funciones con respecto a una aplicación.

Pasos involucrados

Step 1 - En iTunes Connect, asegúrese de tener un unique App ID y cuando creamos la actualización de la aplicación con el bundle ID y firma de código en Xcode con el perfil de aprovisionamiento correspondiente.

Step 2- Cree una nueva aplicación y actualice la información de la aplicación. Puedes saber más sobre esto en AppleAdd new apps documentación.

Step 3 - Agregue un nuevo producto para comprar en la aplicación en Manage In-App Purchase de la página de su aplicación.

Step 4- Asegúrese de configurar los datos bancarios para su aplicación. Esto debe configurarse paraIn-App purchasetrabajar. Además, cree una cuenta de usuario de prueba utilizandoManage Users opción en la página de conexión de iTunes de su aplicación.

Step 5 - Los siguientes pasos están relacionados con el manejo del código y la creación de la interfaz de usuario para nuestra compra en la aplicación.

Step 6 - Crea un single view application e ingrese el identificador del paquete es el identificador especificado en iTunes Connect.

Step 7 - Actualizar el ViewController.xib como se muestra a continuación -

Step 8 - Crear IBOutlets para las tres etiquetas y el botón que las nombra como productTitleLabel, productDescriptionLabel, productPriceLabel y purchaseButton respectivamente.

Step 9 - Seleccione su archivo de proyecto, luego seleccione objetivos y luego agregue StoreKit.framework.

Step 10 - actualización ViewController.h como sigue -

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>

@interface ViewController : UIViewController<
SKProductsRequestDelegate,SKPaymentTransactionObserver> {
   SKProductsRequest *productsRequest;
   NSArray *validProducts;
   UIActivityIndicatorView *activityIndicatorView;
   IBOutlet UILabel *productTitleLabel;
   IBOutlet UILabel *productDescriptionLabel;
   IBOutlet UILabel *productPriceLabel;
   IBOutlet UIButton *purchaseButton;
}

- (void)fetchAvailableProducts;
- (BOOL)canMakePurchases;
- (void)purchaseMyProduct:(SKProduct*)product;
- (IBAction)purchase:(id)sender;

@end

Step 11 - actualización ViewController.m como sigue -

#import "ViewController.h"
#define kTutorialPointProductID 
@"com.tutorialPoints.testApp.testProduct"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   
   // Adding activity indicator
   activityIndicatorView = [[UIActivityIndicatorView alloc]
   initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
   activityIndicatorView.center = self.view.center;
   [activityIndicatorView hidesWhenStopped];
   [self.view addSubview:activityIndicatorView];
   [activityIndicatorView startAnimating];
   
   //Hide purchase button initially
   purchaseButton.hidden = YES;
   [self fetchAvailableProducts];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

-(void)fetchAvailableProducts {
   NSSet *productIdentifiers = [NSSet 
   setWithObjects:kTutorialPointProductID,nil];
   productsRequest = [[SKProductsRequest alloc] 
   initWithProductIdentifiers:productIdentifiers];
   productsRequest.delegate = self;
   [productsRequest start];
}

- (BOOL)canMakePurchases {
   return [SKPaymentQueue canMakePayments];
}

- (void)purchaseMyProduct:(SKProduct*)product {
   if ([self canMakePurchases]) {
      SKPayment *payment = [SKPayment paymentWithProduct:product];
      [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
      [[SKPaymentQueue defaultQueue] addPayment:payment];
   } else {
      UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
      @"Purchases are disabled in your device" message:nil delegate:
      self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
      [alertView show];
   }
}
-(IBAction)purchase:(id)sender {
   [self purchaseMyProduct:[validProducts objectAtIndex:0]];
   purchaseButton.enabled = NO; 
}

#pragma mark StoreKit Delegate

-(void)paymentQueue:(SKPaymentQueue *)queue 
updatedTransactions:(NSArray *)transactions {
   for (SKPaymentTransaction *transaction in transactions) {
      switch (transaction.transactionState) {
         case SKPaymentTransactionStatePurchasing:
            NSLog(@"Purchasing");
         break;
         
         case SKPaymentTransactionStatePurchased:
            if ([transaction.payment.productIdentifier 
            isEqualToString:kTutorialPointProductID]) {
               NSLog(@"Purchased ");
               UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
               @"Purchase is completed succesfully" message:nil delegate:
               self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
               [alertView show];
            }
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
         break;
            
         case SKPaymentTransactionStateRestored:
            NSLog(@"Restored ");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
         break;
            
         case SKPaymentTransactionStateFailed:
            NSLog(@"Purchase failed ");
         break
         default:
         break;
      }
   }
}

-(void)productsRequest:(SKProductsRequest *)request 
didReceiveResponse:(SKProductsResponse *)response {
   SKProduct *validProduct = nil;
   int count = [response.products count];
   
   if (count>0) {
      validProducts = response.products;
      validProduct = [response.products objectAtIndex:0];
      
      if ([validProduct.productIdentifier 
         isEqualToString:kTutorialPointProductID]) {
         [productTitleLabel setText:[NSString stringWithFormat:
            @"Product Title: %@",validProduct.localizedTitle]];
         [productDescriptionLabel setText:[NSString stringWithFormat:
            @"Product Desc: %@",validProduct.localizedDescription]];
         [productPriceLabel setText:[NSString stringWithFormat:
            @"Product Price: %@",validProduct.price]];
      }
   } else {
      UIAlertView *tmp = [[UIAlertView alloc]
         initWithTitle:@"Not Available"
         message:@"No products to purchase"
         delegate:self
         cancelButtonTitle:nil
         otherButtonTitles:@"Ok", nil];
         [tmp show];
   }
   
   [activityIndicatorView stopAnimating];
   purchaseButton.hidden = NO;
}
@end

Nota

Tiene que actualizar kTutorialPointProductID al productID que ha creado para su compra en la aplicación. Puede agregar más de un producto actualizando el NSSet de productIdentifiers en fetchAvailableProducts. De manera similar, maneje las acciones relacionadas con la compra para los ID de productos que agregue.

Salida

Cuando ejecutamos la aplicación, obtendremos el siguiente resultado:

Asegúrese de haber cerrado sesión en su cuenta en la pantalla de configuración. Al hacer clic en Iniciar compra, seleccione Usar ID de Apple existente. Ingrese su nombre de usuario y contraseña de cuenta de prueba válidos. Se le mostrará la siguiente alerta en unos segundos.

Una vez que su producto se haya comprado correctamente, recibirá la siguiente alerta. Puede ver el código relevante para actualizar las funciones de la aplicación donde mostramos esta alerta.