2011-05-06 205 views
3

我构建了一个应用内购买项目。有源代码波纹管的部分:finishTransaction:不起作用

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    NSLog(@"paymentQueue update"); 
    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 
{ 
    NSLog(@"completeTransaction"); 
    // Your application should implement these two methods. 
    [self recordTransaction: transaction]; 
    [self provideContent: transaction.payment.productIdentifier]; 
    // Remove the transaction from the payment queue. 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 

- (void) restoreTransaction: (SKPaymentTransaction *)transaction 
{ 
    NSLog(@"restoreTransaction"); 
    [self recordTransaction: transaction]; 
    [self provideContent: transaction.originalTransaction.payment.productIdentifier]; 
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
} 

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

//Optional, record the transaction infomation 
- (void) recordTransaction: (SKPaymentTransaction *)transaction{ 

    receipt=transaction.transactionReceipt; 

    [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"proUpgradeTransactionReceipt" ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self sendReceipt:receipt]; 

    expiredTime=transaction.transactionDate; 
} 

我可以添加付款并购买沙箱成功,
但执行finishTransaction:后完成的交易不会从defaultQueue删除。
当我添加付款时,defaultQueue会累积。

我犯了一些错误吗?
感谢您的帮助。

回答

2

这真是我的错......
我复制StoreObserver对象每次我购买
后,我添加标志,以防止重复(如下图),错误是固定的。

static bool hasAddObserver=NO; 
    -(void) recvPurchase:(NSString *)purchaseString{ 
     //check user's in-app purchase status 
     if ([self CanPurchase]) { 
       /*=====================================*/ 
      if (!hasAddObserver) {//flag to fix this bug 
       /*=====================================*/ 
       observer=[[StoreObserver alloc]init]; 
       [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 
       hasAddObserver=YES; 
      } 
      SKPayment *payment = [SKPayment paymentWithProductIdentifier:purchaseString]; 
      [[SKPaymentQueue defaultQueue] addPayment:payment]; 
     } 
    }