一位(诚实)用户刚刚告诉我,即使没有购买应用程序内购买,也可以通过简单地按下RESTORE按钮来“购买”应用程序内购买我的应用程序 . 这是我正在使用的代码(我认为这已经足够......但我错了):
- (IBAction) restore {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *) transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch(transaction.transactionState){
case SKPaymentTransactionStatePurchasing:
NSLog(@"Transaction state -> Purchasing ...");
break;
case SKPaymentTransactionStatePurchased:
NSLog(@"Transaction state -> Purchased");
[self activatePurchase];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
NSLog(@"Transaction state -> Restored");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
NSLog(@"Transaction state -> Cancelled");
if(transaction.error.code == SKErrorPaymentCancelled) {
//the user cancelled the payment ;(
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateDeferred:
NSLog(@"Transaction state -> Deferred");
break;
}
}
}
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
[self activatePurchase];
}
有什么东西我不见了吗?
1 回答
付款观察员方法
paymentQueueRestoreCompletedTransactionsFinished
在支付队列完成恢复交易时被调用,无论是否实际恢复了任何交易 . 每次调用restoreCompletedTransactions
时,即使有0次调用updatedTransactions
,也会调用paymentQueueRestoreCompletedTransactionsFinished
.因此,即使没有购买,您也会拨打
activatePurchase
.激活购买的正确位置在
updateTransactions
的SKPaymentTransactionStateRestored
中;就像你为SKPaymentTransactionStatePurchased
案一样 .