2011-05-19 186 views
6

我的InApp购买设置在我的应用程序中。虽然我有一些奇怪的行为。每次我启动应用程序我打电话iPhone inApp购买队列不会清除

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

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

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

与每个事务的完整阵列。我曾尝试打电话是

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
在这些交易然后再重新启动应用程序,但paymentQueue仍然当我打电话addTransactionObserver触发

。我现在的主要目标是刷新事务队列并开始清理。我不知道我是如何进入这个状态的,也不知道如何摆脱这种状态。

回答

5

确保您已实现此方法:

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

你可以建议这将是一个很好的做法实现? – 2014-01-11 12:22:21

+0

@ZivLevy我只是在'transactions'中记录了所有的事务,所以我让自己知道他们被删除了。 – DDPWNAGE 2015-06-19 22:35:38

3

将这个地方来刷新队列(可能是你的负担的方法,但在最终的应用程序中删除):

for (SKPaymentTransaction* transaction in [[SKPaymentQueue defaultQueue] transactions]) { 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

finishTransaction被调用时,观察者的removeTransaction方法将在每个被移动时被调用。

我在队列中有30个,最后我得到了30个这种方法的调用。

+1

必须使用SKPaymentTransaction而不是SKTransaction +第二行中的分号丢失。 – Rilakkuma 2015-11-18 02:43:58

+1

@Rilakkuma我会编辑修复 – DDPWNAGE 2015-11-24 00:42:26

1

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

func cleanUp() { 

    for transaction in SKPaymentQueue.default().transactions { 

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

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

0

SKPaymentTransactionObserver:PaymentQueue..电话:

SKPaymentQueue.default().finishTransaction(transaction) 

请注意,你不能要求所有类型。拨打finishTransaction代替.purchasing将发生错误。所以通过所有交易for不是一个完整的解决方案。

当你调用finishTransaction.purchasing

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

我觉得你的问题是与在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