Objective c finishTransaction:不';行不通
我为应用内购买构建了一个项目。下面是部分源代码:Objective c finishTransaction:不';行不通,objective-c,ios,in-app-purchase,payment,Objective C,Ios,In App Purchase,Payment,我为应用内购买构建了一个项目。下面是部分源代码: - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { NSLog(@"paymentQueue update"); for (SKPaymentTransaction *transaction in transactions) { switch (transaction.t
- (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将累积 我犯了什么错误吗?
谢谢你的帮助。这真是我的错…
每次购买时,我都会复制StoreObserver对象
在我添加了一个防止重复的标志(如下所示)之后,这个bug就被修复了
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];
}
}