2009-10-25 78 views
2

对于我的应用程序,我已经足够了,它会要求确认并为应用内购买帐户,但我不知道如何在购买完成后启用该项目。如何提供storekit内容?

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

[[SKPaymentQueue defaultQueue] addPayment:payment];

多数民众赞成我至今

[[p2Controller tabBarItem] setEnabled:TRUE]; 

这是我想执行

回答

19

首先你应该回去检讨In App Purchase的documentation,苹果提供的代码 - 他们勾勒出这详细了解它,并且了解他们正在做什么是有用的。

你缺少的是SKPaymentTransactionObserver - 你有责任实现这个观察者,你添加为SKPaymentTransactionQueue的观察者。 Apple建议您将应用程序启动时的观察者添加到默认队列中,以便它能够观察在您的应用程序运行时发生的所有事务。

本质上,您需要编写自己的实现SKPaymentTransactionObserver协议的类。此类所要做的就是观察当iTunes商店处理付款时从支付队列中获取回调,并让您捕获成功和失败事件。

下面是付款观察骨架:

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 

一旦实现了PaymentObserver您需要关闭添加实例它作为交易观察者的默认支付队列。

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

嘿,这个答案今天保存了我的培根。确定它在苹果文档中,但我试图修复另一个开发人员编写的代码中的错误,并查看了这一点,我能够看到他错过了什么。谢谢! –