首页 文章

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

提问于
浏览
3

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

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

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

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

3 回答

  • 0

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

  • 0

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

    我认为关键是委托可能并不总是与开始交易的同一个演员 . 因此,代表可以在 SKPaymentTransactionStatePurchasing 上发布一个忙碌的指示器,而不必用某种方式将任何发布请求的人连接到管理显示器的人 .

  • 3

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

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

    @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
    

相关问题