iOS In-App Purchase可安全恢复以前的购买

时间:2013-03-27 17:50:59

标签: iphone ios in-app-purchase payment storekit

我已在我的应用中实施了应用内购买,我有两个问题。这是我使用的代码:

- (IBAction)buyProduct1:(id)sender {
    SKPayment *payment = [SKPayment paymentWithProduct:product1];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}

- (IBAction)restorePurchases:(id)sender {
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:

                break;
            case SKPaymentTransactionStatePurchased:

                //Can I be 100% sure that this method is only called when the product is bought?
                [self product1Bought:transaction];

                break;
            case SKPaymentTransactionStateRestored:

                //What code should I have here to safely restore product1 if the product is bought?

                break;
            case SKPaymentTransactionStateFailed:

                break;
            default:
                break;
        }
    }
}

- (void)product1Bought:(SKPaymentTransaction *)transaction {
    NSString *string = @"Product1";
    [[NSUserDefaults standardUserDefaults] setObject:string forKey:@"Product1"];
    NSLog(@"Product1 is bought");
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

1.我只是想知道我是否可以100%确定productBought方法仅在成功购买后调用,而不是如果发生任何奇怪的事情并且产品没有真正购买?

2.如何检查product1是否早先购买,以便我可以调用product1Bought方法?

2 个答案:

答案 0 :(得分:2)

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

{

 if ([queue.transactions count] == 0)
 {
     UIAlertView *restorealert = [[UIAlertView alloc]
                                  initWithTitle:@"Restore"
                                  message:@"There is no products purchased by you"
                                  delegate:self
                                  cancelButtonTitle:@"Ok"
                                  otherButtonTitles:nil];

     [restorealert show];
     activityIndicator.hidden = YES;


 }
else
{
    NSString *productID;



    for(SKPaymentTransaction *transaction in queue.transactions)
    {
     productID = transaction.payment.productIdentifier;
        NSLog(@"the product identifier is %@",productID);

}

在完成恢复后,您可以获得您购买的productId

答案 1 :(得分:1)

1)工作正常,用户购买时数据可用

2)对于早期购买的商品,您可以在SKPaymentTransactionStateRestored下调用此方法:

[self RestorePurchases];

-(void)RestorePurchases{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}