2009-10-25 4 views
2

Pour mon application, je l'ai assez loin pour demander une confirmation et un compte pour un achat in-app, mais je ne sais pas comment activer l'élément après l'achat est terminé.Comment fournir du contenu de magasin?

SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"com.silver.tapp.page2"]; 

[[SKPaymentQueue defaultQueue] addPaiement: payment];

Thats ce que j'ai jusqu'à présent

[[p2Controller tabBarItem] setEnabled:TRUE]; 

c'est le code que je voudrais exécuter

Répondre

19

D'abord, vous devriez vraiment revenir en arrière et revoir le In App Purchase documentation qu'Apple fournit - ils décrivent ce en détail et il est utile de comprendre ce qui se fait de leur côté. Ce qui vous manque est le SKPaymentTransactionObserver - il est de votre responsabilité d'implémenter cet observateur que vous ajoutez en tant qu'observateur de SKPaymentTransactionQueue. Apple vous recommande d'ajouter l'observateur au lancement de l'application à la file d'attente par défaut afin qu'il puisse observer toutes les transactions qui ont lieu pendant que votre application est en cours d'exécution. Essentiellement, vous devez écrire votre propre classe qui implémente le protocole SKPaymentTransactionObserverservice. Ce que cette classe fait est observer attraper les rappels de la file d'attente de paiement quand le magasin d'iTunes traite le paiement et vous attrapez les événements de succès et d'échec.

Voici le squelette pour l'observateur de paiement:

PaymentObserver.h

#import <StoreKit/StoreKit.h> 

@interface PaymentObserver : NSObject <SKPaymentTransactionObserver> { 
} 

- (void) completeTransaction: (SKPaymentTransaction *)transaction; 
- (void) restoreTransaction: (SKPaymentTransaction *)transaction; 
- (void) failedTransaction: (SKPaymentTransaction *)transaction; 

@end 

PaymentObserver.m

#import "PaymentObserver.h" 
@implementation PaymentObserver 

- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions 
{ 
    // handle payment cancellation 
} 

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    // handle the payment transaction actions for each state 
    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; 
{ 
    // Record the transaction 
    //... 

    // Do whatever you need to do to provide the service/subscription purchased 
    //... 

    // Remove the transaction from the payment queue. 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

} 

- (void) restoreTransaction: (SKPaymentTransaction *)transaction 
{ 
    // Record the transaction 
    //... 

    // Do whatever you need to do to provide the service/subscription purchased 
    //... 

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 

- (void) failedTransaction: (SKPaymentTransaction *)transaction 
{ 
    if (transaction.error.code != SKErrorPaymentCancelled) 
    { 
    // Optionally, display an error here.  
    } 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 

@end 

Une fois que vous avez mis en œuvre le PaymentObserver vous devez ajouter une instance de à la file d'attente de paiement par défaut en tant qu'observateur de transaction.

// Done at app launch... 
PaymentObserver *paymentObserver = [[PaymentObserver alloc] init]; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:paymentObserver]; 
+0

hé, cette réponse m'a sauvé mon bacon aujourd'hui. Bien sûr, c'est dans les docs apple, mais j'essayais de corriger un bug dans le code écrit par un autre développeur et en regardant ça, j'ai pu voir ce qu'il avait manqué. Je vous remercie! –

Questions connexes