iOS: acquisto in-app

L'acquisto in-app viene utilizzato per acquistare contenuti aggiuntivi o aggiornare le funzionalità rispetto a un'applicazione.

Passaggi coinvolti

Step 1 - In iTunes Connect, assicurati di avere un file unique App ID e quando creiamo l'aggiornamento dell'applicazione con l'estensione bundle ID e firma del codice in Xcode con il profilo di provisioning corrispondente.

Step 2- Crea una nuova applicazione e aggiorna le informazioni sull'applicazione. Puoi saperne di più su questo in AppleAdd new apps documentazione.

Step 3 - Aggiungi un nuovo prodotto per l'acquisto in-app in Manage In-App Purchase della pagina della tua applicazione.

Step 4- Assicurati di impostare le coordinate bancarie per la tua applicazione. Questo deve essere impostato perIn-App purchaselavorare. Inoltre, crea un account utente di prova utilizzandoManage Users opzione nella pagina di connessione di iTunes della tua app.

Step 5 - I passaggi successivi sono relativi alla gestione del codice e alla creazione dell'interfaccia utente per il nostro acquisto in-app.

Step 6 - Crea un file single view application e inserisci l'identificatore del pacchetto è l'identificatore specificato in iTunes Connect.

Step 7 - Aggiorna il file ViewController.xib come mostrato di seguito -

Step 8 - Crea IBOutlets per le tre etichette e il pulsante che le denomina rispettivamente productTitleLabel, productDescriptionLabel, productPriceLabel e purchaseButton.

Step 9 - Seleziona il file di progetto, quindi seleziona le destinazioni e quindi aggiungi StoreKit.framework.

Step 10 - Aggiorna ViewController.h come segue -

#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 - Aggiorna ViewController.m come segue -

#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

Devi aggiornare kTutorialPointProductID con il productID che hai creato per il tuo acquisto in-app. È possibile aggiungere più di un prodotto aggiornando NSSet di productIdentifiers in fetchAvailableProducts. Allo stesso modo, gestisci le azioni relative all'acquisto per gli ID prodotto aggiunti.

Produzione

Quando eseguiamo l'applicazione, otterremo il seguente output:

Assicurati di esserti disconnesso dal tuo account nella schermata delle impostazioni. Facendo clic su Avvia acquisto, seleziona Usa ID Apple esistente. Immettere il nome utente e la password dell'account di prova valido. Ti verrà mostrato il seguente avviso in pochi secondi.

Una volta che il tuo prodotto è stato acquistato con successo, riceverai il seguente avviso. È possibile visualizzare il codice pertinente per l'aggiornamento delle funzionalità dell'applicazione in cui viene visualizzato questo avviso.