paymentQueue:(SKPaymentQueue *)队列updatedTransactions :( NSArray *)事务在restoreCompletedTransactions时不被调用

时间:2012-07-14 11:54:21

标签: ios objective-c in-app-purchase storekit

您好我需要在Inapp-Purchase中实现恢复功能,为此创建了一个“恢复”按钮,它正在调用方法

-(void)restorePurchasedProductsWithProductId:(NSString*)prodID
{
    _productIdsArray = [[NSMutableArray alloc] init];
    productID = [prodID retain];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

它为我提供了一个输入apple id密码的弹出窗口。在这之后没有任何反应。

我读到了一个叫它的地方

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

所以我确实喜欢这个

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    NSLog(@"paymentQueue");
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"restored");
                [self restoreTransaction:transaction];
                break;
            default:
                break;

        }
    }
}

但问题是上面的方法并没有调用这个

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

也不是

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

我还包括了所需的协议,

有些正文可以帮助我为什么这些委托方法不会要求恢复过程。 我正在尝试使用测试帐户。

2 个答案:

答案 0 :(得分:12)

您需要确保实施paymentQueueRestoreCompletedTransactionsFinished:paymentQueue: restoreCompletedTransactionsFailedWithError:的类已注册为您的付款队列的观察员。

如果您已在UIViewController中编写此代码,请尝试在viewDidLoad中添加此代码:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

viewDidDisappear

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

答案 1 :(得分:1)

我也面临像一个问题;

经过研究和研究修改,我意识到:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]

方法未立即实施。

通常,我检查transaction.transactionReceipt并将其发送到我的服务器,然后我发送一个回调来完成Transaction。最后,我理解了不立即调用完成交易的问题。当我更改我的代码时,我的应用程序正常运行。

有趣的是,当我在沙盒环境中测试时,一切正常。但是,在AppStore应用程序中效果不佳。当我做这个修改时,我的问题就解决了。