iPhone inApp购买队列不会清除

时间:2011-05-19 19:27:35

标签: iphone in-app-purchase

我的应用中有InApp购买设置。我虽然有一些奇怪的行为。每次我启动应用程序时,我都会打电话

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

设置初始观察者。然而,这会立即触发

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

包含每个事务的完整数组。我试过打电话

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

在每个交易中再次重新启动应用程序,但是当我调用addTransactionObserver时,paymentQueue仍然会触发。我现在的主要目标是刷新事务队列并开始清理。我不知道我是如何进入这种状态的,也不知道如何摆脱它。

5 个答案:

答案 0 :(得分:5)

确保您已实施此方法:

-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions;

答案 1 :(得分:3)

把它放在某个地方以刷新队列(可能是你的加载方法,但是在你的最终应用程序中删除它):

validate :valid_country_codes

调用for (SKPaymentTransaction* transaction in [[SKPaymentQueue defaultQueue] transactions]) { [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; } 时,移动每个方法时将调用观察者的finishTransaction方法。

我的队列中有30个,最后我调用了30个方法。

答案 2 :(得分:1)

每次进行购买或恢复产品时,您必须确保完成交易。如果遇到此问题,则应清理队列,然后适当地开发逻辑。通过在swift 3中运行类似的东西可以获得快速清理。(这与前面的答案相同)。但它不应该在你真正的应用程序中。

func cleanUp() {

    for transaction in SKPaymentQueue.default().transactions {

        SKPaymentQueue.default().finishTransaction(transaction)   
    }
}

此外,您还必须在appDelegate中添加和删除观察者。这是建议,也是最好的避免问题。

答案 3 :(得分:1)

来自SKPaymentTransactionObserver:PaymentQueue..来电:

SKPaymentQueue.default().finishTransaction(transaction)

请注意,您无法呼叫所有类型。为finishTransaction调用.purchasing会因错误而崩溃。因此,for所有交易都不是一个完整的解决方案。

致电finishTransaction .purchasing

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot finish a purchasing transaction'

答案 4 :(得分:1)

我认为您的问题与iTunes Connect中的沙盒用户帐户有关。如果您没有任何沙箱用户,本指南对于设置它们非常有帮助:
https://support.magplus.com/hc/en-us/articles/203809008-iOS-How-to-Test-In-App-Purchases-in-Your-App

如果您有沙盒用户:

您可以尝试拨打finishTransaction:但是,您需要确保交易的SKPaymentTransactionState可以接受。

根据finishTransaction的文档:

// Asynchronous.  
// Remove a finished (i.e. failed or completed) transaction from the queue.
// Attempting to finish a purchasing transaction will throw an exception.

所以要安全地删除已完成的交易:

for transaction in SKPaymentQueue.default().transactions {
    guard 
        transaction.transactionState != .purchasing, 
        transaction.transactionState != .deferred 
    else { 
        //Optionally provide user feedback for pending or processing transactions
        return
    }

    //Transaction can now be safely finished
    SKPaymentQueue.default().finishTransaction(transaction)   
}

.purchasing.deferred上的文档相当模糊:

case purchasing // Transaction is being added to the server queue.

case deferred  // The transaction is in the queue, but its final status is pending external action.

据我所知,处理待处理和/或处理事务应该是相当被动的。该应用程序已经完成了所需的一切,并正在等待来自iTunes Store服务器的响应,或其他一些依赖(即支付授权)。

当事务更新时,

paymentQueue: updatedTransactions:将在队列的SKPaymentTransactionObserver上被调用。

至于你的交易队列如何陷入困境,我愿意打赌你队列中的所有交易都处于状态.purchasing。这很可能是iTunes Connect / Sandbox用户/制作iTunes帐户中的错误。其他人,包括我自己,也有这个问题。有一个错误报告提交给它。尝试重新创建/更改沙盒用户的密码,或创建新的沙盒用户进行测试。

更多信息: https://forums.developer.apple.com/thread/70418