Tutoriel Membre par DricABrac : In App Purchase

Voici un tutoriel pour mettre en place et tester l’In App Purchase pour une application. En quoi cela consiste t’il ? Proposer du contenu payant que l’on peut ajouter directement depuis votre application.
Par exemple, dans un jeu de shoot, vous pourrez proposer au joueur d’acheter des armes supplémentaires.
Ce tutoriel va donc vous guider pas à pas !

Attention, vous ne pouvez proposer du contenu payant que si votre application est payante à la base.

http://www.ipup.fr/forum/userimages/sdk-iap-iphone.png

Voir les docs d’Apple : Guide du « Store Kit »

Il y a différentes étapes pour mettre en place cette fonctionnalité.

1.    Création d’un AppID.

Connectez vous sur votre compte développeur Apple «Developer Program Portal».
Dans l’onglet App IDs, cliquez sur New App ID et remplissez les informations demandées (ex. com.testdomain.testinapp)
ATTENTION : Ne pas mettre une * dans le Bundle Identifier !!!

2.    Autoriser le «In App Purchase».

Configurez votre nouvel App ID en autorisant l’In App Purchase.

3.    Création d’un mobile provisionning.

Dans l’onglet Provisionning, cliquez sur New Profile et remplissez les informations nécessaires. Cliquez ensuite sur Download pour pouvoir le récupérer dans votre application.

La partie concernant le «Developer Program Portal» est terminée. Passons à la suite.

4.    Création d’une application de test.

Tout d’abord, il faut créer un projet sous XCode et installer le StoreKit.framework. Puis insérez cette classe dans votre projet (typiquement, vous créerez une classe type MyStoreObserver) :

// MyStoreObserver.h
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
#import <StoreKit/SKPaymentTransaction.h>
 
@interface MyStoreObserver : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver> {
}
- (void) requestProductData;
@end

 

// MyStoreObserver.m
#import "MyStoreObserver.h"
 
@implementation MyStoreObserver
 
- (void) requestProductData
{
SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:@"YourAppProductID"]];
request.delegate = self;
[request start];
}
 
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray *myProduct = response.products;
SKProduct *product = [myProduct objectAtIndex:0];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedString = [numberFormatter stringFromNumber:product.price];
[numberFormatter release];
NSLog(@"Product 0 : %@, %@, %@, %@, %@",
product.productIdentifier, product.localizedDescription,
product.localizedTitle, product.priceLocale.localeIdentifier,
formattedString);
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
}
}
 
- (void) completeTransaction: (SKPaymentTransaction *)transaction
{
//[self recordTransaction: transaction];
//[self provideContent: transaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
 
- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
//[self recordTransaction: transaction];
//[self provideContent: transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
 
- (void) failedTransaction: (SKPaymentTransaction *)transaction
{
if (transaction.error != SKErrorPaymentCancelled)
{
UIAlertView *successesAlert = [[UIAlertView alloc] initWithTitle:@"In-App-Purchase Error:"
message:@"There was an error purchasing this item please try again."
delegate : selfcancelButtonTitle:@"OK"otherButtonTitles:nil];
[successesAlert show];
[successesAlert release];
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
 
@end

 

Ensuite, vous pouvez instancier cette classe à l’endroit voulu de cette manière :

MyStoreObserver *observer = [[MyStoreObserver alloc] init];   
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

 

Puis, si vous voulez vérifier votre transaction :

[observer requestProductData];

 

Vous pouvez voir que dans cette méthode, vous avez un NSString* appelé «YourAppProductID». Nous verrons un peu plus bas ce qu’il faut inscrire à la place.

Dernière chose avant de compiler votre projet, n’oubliez pas de remplir les champs des infos avec le mobile provisionning correspondant.

Maintenant, que votre projet est créé et compilé, nous pouvons créer une application.

Pour cela, allez dans votre compte développeur puis dans «Manage Your Application». Cliquez sur Add New Application. Remplissez toutes les informations pour créer votre application de test.

Une fois que vous êtes sur la page pour remplir le binaire, cochez la case «Upload binary later» et remplissez tous les autres champs.
Maintenant que votre application est créée, vous devez voir dans la liste de vos applications que vous pouvez cliquer sur «Manage In App Purchases».
C’est dans cette section que nous allons créer la liste des produits qui seront vendus.

5.    Création de la liste des produits.

Cliquez sur «Create New» et remplissez les champs nécessaires. A savoir, le prix, la langue, le nom, la description, le screenshot mais surtout le «Product ID» (très important, par exemple, 001 ou comme le conseille Apple com.domainname.appname.productID). C’est à vous de voir afin de reconnaître plus facilement votre produit.

Une fois, que vous avez créé votre item et que vous le voyez dans la liste dans l’état «Pending». Recliquez sur l’item et cliquez sur «Approve …».

Vous devez avoir dans la liste le nom de votre item avec son productID ainsi que «Approved by Developer».

Vous pouvez en créer autant que vous voulez ! big_smile

6.    Création d’un compte de test.

Pour tester votre application, il vous faut obligatoirement un compte iTunes de test (appelé SandBox). Voir les docs d’Apple.
Pour cela, sur votre compte iTunes Connect, cliquez sur «Manage users» puis «In App purchase Test User» et créez-vous un compte.

7.    Connexion avec votre compte.

Sur votre iPhone ou iPod, allez dans «Réglages» puis «Store». Déconnectez vous de votre compte principal et reconnectez vous avec votre compte de test.
INFO : Il faut finir de le configurer en rentrant vos codes bancaires, mais rien ne sera prélevé ! Vous pouvez voir que c’est un compte de test car l’adresse est remplie avec l’adresse de Cupertino.

Quittez les réglages.

8.    Vérification de l’In App Purchase.

Revenez maintenant dans votre projet XCode et remplacez «YourAppProductID» par le productID de votre produit (ex. 001 ou com.domainname.appname.productID).

Pour tester rapidement l’état de fonctionnement, vous pouvez mettre le bout de code permettant d’appeler un produit dans votre applicationDidFinishLaunching :

MyStoreObserver *observer = [[MyStoreObserver alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
[observer requestProductData];

 

Vous devez voir ressortir les infos que vous avez remplies.

Un autre test vous permet de vérifier le fonctionnement de l’achat. Créez un bouton avec sa méthode de clic. Mettez ce code suivant :

SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"001"];
[[SKPaymentQueue defaultQueue] addPayment:payment];
[SKPaymentQueue canMakePayments];

 

Vous devriez avoir une fenêtre vous demandant de confirmer votre achat.

Voilà pour ce tutoriel sur l’In App purchase d’Apple. En espérant ne rien avoir oublié !!!