我的应用中有InApp购买设置。我虽然有一些奇怪的行为。每次我启动应用程序时,我都会打电话
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
设置初始观察者。然而,这会立即触发
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
包含每个事务的完整数组。我试过打电话
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
在每个交易中再次重新启动应用程序,但是当我调用addTransactionObserver时,paymentQueue仍然会触发。我现在的主要目标是刷新事务队列并开始清理。我不知道我是如何进入这种状态的,也不知道如何摆脱它。
答案 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帐户中的错误。其他人,包括我自己,也有这个问题。有一个错误报告提交给它。尝试重新创建/更改沙盒用户的密码,或创建新的沙盒用户进行测试。