restoreCompletedTransactions for Auto-Renewable subscriptions

时间:2011-07-18 12:50:43

标签: ios in-app-purchase subscriptions

我正在尝试在我的应用中实现自动续订订阅并遇到问题:看起来restoreCompletedTransactions仅从最后一次调用restoreCompletedTransactions到现在恢复交易。

例如,如果订阅于6月1日开始,我在6月15日致电restoreCompletedTransactions,则会返回6月1日至6月15日的所有交易。下次我在6月16日致电restoreCompletedTransactions它返回从6月15日到6月16日的交易。如果自上次调用restoreCompletedTransactions以来没有自动更新事务,则它不返回任何内容。

这是对的吗?如何检索有关以前交易的信息?

2 个答案:

答案 0 :(得分:0)

这与我所经历的情况背道而驰。根据我的经验,当你拨打restoreCompletedTransactions时,它会向你发送一大堆收据,这些收据似乎每次拨打电话时都会增加。

但要回答您的问题,Apple建议您存储并验证来自您自己服务器的所有收据。因此,只要应用收到收据,您就应该将其发送到服务器进行验证和存储。这样,如果restoreCompletedTransactions真的只给你新的交易,那就无所谓了。

此外,当您通过Apple验证自动续订收据时,他们会向您发送与该订阅相关的最新收据。

答案 1 :(得分:0)

不确定这是否是一个好的解决方案,但这是上述内容的扩展。 执行restoreCompletedTransactions,并检查购买交易的日期。也许正在恢复交易(也许有人可以告诉我们>

//在您的主要代码中的某处

#import <StoreKit/StoreKit.h>
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

//然后更新StoreKit回调函数。 kProductId是应用商店中订阅的productId

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"Purchasing");
                break;

            case SKPaymentTransactionStatePurchased:
                if ([transaction.payment.productIdentifier
                     isEqualToString:kProductID]) {
                    NSLog(@"Purchased ");
                    // update based on transaction.transactionDate
                }
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;

            case SKPaymentTransactionStateRestored:
                NSLog(@"Restored ");
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                if ([transaction.payment.productIdentifier
                     isEqualToString:kProductID]) {
                    // update based on transaction.transactionDate
                }
                break;

            case SKPaymentTransactionStateFailed:
//                NSLog(@"Purchase failed ");
            default:
                break;
        }
    }
}