2011-05-06 8 views
3

인앱 구매를위한 프로젝트를 빌드합니다. 내가 지불을 추가하고 샌드 박스에서 구매를 할 수finishTransaction : does not work

- (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]; 
     } 
    } 
관련 문제