Achats intégrés dans iOS


Introduction

L'achat intégré est une fonctionnalité utilisée par les applications pour acheter du contenu supplémentaire ou mettre à niveau des fonctionnalités.

Étapes de l'exemple

1. Dans iTunes Connect, assurez-vous d'avoir un App ID unique. Lors de la création du bundle ID et de la mise à jour de l'app, le code sera signé dans Xcode avec le profil de provisionnement correspondant.

2. Créez une nouvelle app et mettez à jour les informations de l'app. Vous pouvez en savoir plus à ce sujet dans la documentation d'Apple « Adding a New App ».

3. Sur la page de l'app, sous Gérer les achats intégrés, ajoutez un nouveau produit pour l'achat intégré.

4. Assurez-vous que les coordonnées bancaires sont définies pour l'app. Celles-ci doivent être configurées pour l'achat intégré. De plus, dans iTunes, utilisez l'option Gérer les utilisateurs pour créer un compte utilisateur de test sur la page de votre app.

5. L'étape suivante consiste à gérer le code et à créer l'interface utilisateur liée à notre achat intégré.

6. Créez une application à vue unique, et saisissez l'identifiant de bundle dans iTunes Connect qui correspond à l'identifiant spécifié.

7. Mettez à jour ViewController.xib comme indiqué ci-dessous.

InAppPurchase_OutputInterface

8. Créez des IBOutlets pour les trois étiquettes et le bouton, en les nommant respectivement productTitleLabel, productDescriptionLabel, productPriceLabel et purchaseButton.

9. Sélectionnez le fichier de projet, puis sélectionnez la cible, puis ajoutez StoreKit.framework.

10. Mettez à jour ViewController.h comme indiqué ci-dessous.

#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

11. Mettez à jour ViewController.m comme indiqué ci-dessous.

#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

Remarque :Vous devez modifier le kTutorialPointProductID pour l'achat intégré que vous avez créé. En modifiant le NSSet d'identifiants de produit dans fetchAvailableProducts, vous pouvez ajouter plusieurs produits.

Sortie

Exécutez l'application, la sortie est la suivante.

InAppPurchase_Output1

Assurez-vous d'être connecté. Cliquez sur purchase pour sélectionner l'Apple ID existant. Saisissez le nom d'utilisateur et le mot de passe d'un compte de test valide. Après quelques secondes, le message suivant s'affiche.

InAppPurchase_Output2

Une fois le produit acheté avec succès, les informations suivantes seront affichées. Là où ces informations sont affichées, vous pouvez mettre à jour le code lié aux fonctionnalités de l'application.

InAppPurchase_Output3

Autres extensions