iOS In App Purchases:只有一笔付款添加到SKPaymentQueue,但SKPaymentTransactionObserver方法被多次调用

时间:2011-11-04 11:54:34

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

我正在使用测试用户(在沙箱中)测试IAP,我有一个实现SKPaymentTransactionObserver协议的类,当用户选择某个表视图单元格时,我发起付款:

SKPayment *payment = [SKPayment paymentWithProductIdentifier:productIdentifier];
[[SKPaymentQueue defaultQueue] addPayment:payment];

这只做了一次,我检查过:代码被调用一次。问题是' - (void)paymentQueue:(SKPaymentQueue *)队列updatedTransactions:(NSArray *)transactions'有时被多次调用,我无法弄清楚原因。这并不总是会发生,但绝不应该发生。

在沙箱测试时是否有人遇到此行为(如果在真实情况下会发生这将是一个大问题)?

3 个答案:

答案 0 :(得分:3)

我通常'分配'我的委托,但这次保留了处理所有事务处理的类的委托。委托(视图控制器)和应用内购买类都被泄露了。因此,每次我呈现视图控制器时, 另一个实例已创建,另一个代理集已设置。在处理交易时,应用程序购买类的实例数量与漫游的数量一样多:)作为呈现视图的次数。 所以,这不是IAP问题 - 这是注意力和内存管理的问题。

答案 1 :(得分:0)

这是正常行为,是您使用transactionState获取任何正在进行的交易状态的原因。其中一个可能的交易状态是SKPaymentTransactionStatePurchasing - 即系统告诉您交易中有一些进展但尚未完成。

我认为关键是委托可能并不总是与开始交易的同一个演员。因此,代表可以在SKPaymentTransactionStatePurchasing上发布一个忙碌的指示器,而无需你想出任何方式将任何发布请求的人联系到管理显示器的人。

答案 2 :(得分:0)

您可能获得多次回调的原因是您无意中注册了多个观察者。如果要实例化在付款队列中注册为观察者的视图控制器,则需要确保在事务完成时将其删除。

处理此类情况的更好方法可能是让单个观察者将通知发送回您的控制器。

@implementation MyViewController : SomeParentController<SKPaymentTransactionObserver>

- (void)startPayment:(SKPayment *)payment {
  SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];

  /* Unless MyViewController is a singleton this line of code will add a new observer
   * to the default queue. The observer is retained and every time a transaction is added
   * to the queue the callback code will be executed on all registered observers.
   */
  [queue addTransactionObserver:self];
  [SKPaymentQueue addPayment:payment];
}

- (void)paymentQueue:(SKPaymentQueue *)queue 
   updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
   // Your transaction processing code here
}

@end