【问题标题】:StoreKit: Catch failed restore?StoreKit:捕获失败的恢复?
【发布时间】:2011-12-06 23:33:18
【问题描述】:

我正在使用恢复按钮实现应用内购买功能。

我有一个全新的测试用户设置,没有支付任何费用。

当我点击恢复按钮并使用新的测试用户登录时,我无法捕捉到任何告诉我恢复事务失败的委托方法(因为没有要恢复的内容)。

唯一被调用的方法是-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)queue,但是这个方法在恢复成功的情况下也会被调用。

我现在能做什么?这种情况怎么抓?


补充:我有一个进度指示器,上面写着“正在联系 App Store”,我需要一个调用,我也可以在失败的情况下隐藏它。

【问题讨论】:

  • 由于该 issue 不是由 Test 用户购买,您将不会收到来自 iTunesConnect 的回复SKPaymentTransactionStateRestored,最终完成您的交易。
  • 很清楚。但是我显示了一个“正在联系 App Store”的进度指示器,我仍然需要一个事件来在失败时隐藏它。
  • 当没有要恢复的事务时,没有失败。其实这个案子算是成功了。
  • 然后在-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)queue方法中隐藏你的指标
  • 是的,类似的东西。我计算 queue.transactions 数组,然后如果它返回零,我委托失败。

标签: iphone in-app-purchase storekit


【解决方案1】:

Noah:这是给你的代码 sn-p:

-(void)restore {

    [self.delegate showLoadingScreen];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];


}

还有以下方法:

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

    if (!queue.transactions || [queue.transactions count] == 0) {

        [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."];

    } else {

        BOOL didRestore = NO;

        for (SKPaymentTransaction *t in queue.transactions) {

            if (t.transactionState == SKPaymentTransactionStateRestored || t.transactionState == SKPaymentTransactionStatePurchased) {

                NSTimeInterval now = [[NSDate date] timeIntervalSince1970] - _timeOffset;
                NSTimeInterval expire = [t.transactionDate timeIntervalSince1970] + kExplorerSubscriptionSecondLength;
                NSTimeInterval purchase = [t.transactionDate timeIntervalSince1970];

                if (purchase <= now && now <= expire) {

                    didRestore = YES;
                }

            }


        }

        if (!didRestore)
            [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."];

    }    

    [self.delegate dismissLoadingScreen];

}

如果对你有帮助,请告诉我......

【讨论】:

  • 谢谢,解决了...用这一行:D (!queue.transactions || [queue.transactions count] == 0)
  • 我仍然发现我需要 else 语句。但我现在记得在什么情况下......如果用户的订阅已过期,并且您尝试恢复,它仍会返回用户订阅的每个月之前的购买。这就是为什么我检查时间段。如果“现在”不在任何时间段内,则不会恢复任何内容。这可能不适用于您的情况
【解决方案2】:

当您恢复事务时,有两种委托方法:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error

第一个 (paymentQueueRestoreCompletedTransactionsFinished) 在所有交易都恢复后被调用。如果您之前没有任何购买,它也会调用此方法,因为恢复的工作正常,但没有什么可恢复的。

当恢复事务出错时调用另一个方法 (restoreCompletedTransactionsFailedWithError)。

如果您需要向用户显示一条消息,告诉他没有要恢复的交易,您可以使用:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

这里有一个代表这个代表的小sn-p:

//
// called when the transaction status is updated
//
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    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];
                restoredTransaction++;
                break;
            default:
                break;
        }
    }
}

然后您可以使用 restoredTransaction 变量了解是否有任何交易已在 paymentQueueRestoreCompletedTransactionsFinished

上恢复

【讨论】:

  • 但是 Geri 是如何解决这个问题的呢?他说他通过返回 0 解决了这个问题,如果之前没有购买,则从 NSLog 返回。
【解决方案3】:

您可以使用以下委托方法来恢复事务。

 -(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error{
NSLog(@"Error when purchasing: %@",error);

}

【讨论】:

  • 只有在恢复被取消或出现互联网连接错误时才会调用该委托。我想如果用户之前没有购买过任何东西,那就是问题所在。看看问题的cmets。有一个返回值的解决方案,但我不知道如何。
猜你喜欢
  • 2015-02-18
  • 2015-06-05
  • 2014-05-22
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多