restoreCompletedTransactions坏了吗?

时间:2011-04-11 23:24:39

标签: iphone in-app-purchase

SDK 4.3中的restoreCompletedTransactions是否已损坏?

我正在尝试恢复自动续订订阅。它不会导致对updatedTransactions的回调。这是我的代码。

 {
 ....
 [appDelegate.inapp loadStore];

 [[SKPaymentQueue defaultQueue]  restoreCompletedTransactions];
 ....
 }

期望回调到updatedTransactions,但不接收它。

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
     NSLog(@"IN updatedTransactions,  transaction.transactionState");

    for (SKPaymentTransaction *transaction in transactions)
    {

        switch (transaction.transactionState)
        {
            ...
            ...
            case SKPaymentTransactionStateRestored:
            NSLog(@"IN updatedTransactions,  SKPaymentTransactionStateRestored");
            [self restoreTransaction:transaction];
            break;

        }
    }
}

但我最后会接到这个电话。

-(void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
}

7 个答案:

答案 0 :(得分:24)

如果您在Sandbox环境中进行测试并且测试用户已损坏,这仍然会发生(1)。在iTunes Connect中创建一个新的测试用户,然后重试。

目前还不完全清楚是什么让测试用户变坏了;从我收集的内容中,在非沙箱环境中使用它们可以做到这一点,但也可能有其他原因。

(1)Xcode 4.3.1,iOS SDK 5.1

答案 1 :(得分:6)

确保在使用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

之前添加观察者

您的代码应该是:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

答案 2 :(得分:3)

我能够解决这个问题但很奇怪。在我的测试设备上,我被iTunes窃听,登录到多个测试用户帐户。我通常只是点击取消并使用我想要恢复的帐户测试我的恢复。这次我决定输入这些其他恼人的登录框的密码。它工作,下次我重新启动我的应用程序并点击恢复它没有错误我登录到其他测试帐户,只是我测试的那个。我继续进行恢复,它确实恢复了我想要看到的项目。

我说我们正在遇到愚蠢的沙盒问题,而且我们也知道苹果在应用购买方面已经发生了变化。继续玩它,你会得到它锻炼。

希望这可以帮助你。

答案 3 :(得分:3)

产品消耗品无法恢复。

产品非消费品可以恢复。

检查您的产品是否为非消耗品类型。

答案 4 :(得分:0)

如果您收到paymentQueueRestoreCompletedTransactionsFinished,则不需要updatedTransactions回调。 “队列”有一个你的交易清单,你可以通过这些交易。

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
    for (SKPaymentTransaction *transaction in queue.transactions) 
        if ([myItem.productID isEqualToString:transaction.payment.productIdentifier])
            myItem.purchased = YES;
}

答案 5 :(得分:0)

确保Xcode中的内部版本号没有空格。例如" 1.0 Beta"。使用空间updatedTransactions将不会被调用。收据验证也可能失败。

答案 6 :(得分:0)

这里没有提到的另外两个要点:

  1. 如果您使用的是 Firebase ,请确保在初始化Firebase之前添加观察者,https://firebase.google.com/docs/analytics/get-started?platform=ios
  2. 确保在处理购买时调用 finishTransaction 方法。您将无法还原未完成的交易。