iOS 的 SKPayment addTransactionObserver & defaultqueue,是怎么回事?

iOS's SKPayment addTransactionObserver & defaultqueue, what is the story?

我正在纠结是否需要添加事务观察器以及是否需要删除事务观察器以及这一切的位置和内容...

我继承的代码包括带有观察者的应用程序委托... AppDelegate ->

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    SKPaymentQueue *paymentQueue = [self.injector getInstance:[SKPaymentQueue class]];
    [paymentQueue addTransactionObserver:self.purchaseHelper];
}

我正在处理购买助手的恢复部分... PurchaseHelper ->

-(void) beginRestorePurchases:(BOOL)serverRestore {
    self.serverRestore = serverRestore;
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}



-(void) paymentQueueRestoreCompletedTransactionsFinished : (SKPaymentQueue *) queue {
    for (SKPaymentTransaction *transaction in queue.transactions) {
       [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
}

我目前关心的是恢复购买。 (我意识到我正在为代码的另一部分(购买部分)使用依赖注入模式,所以它有所不同。我不确定这是否对我的问题也有影响。)

问题是我不知道是否应该添加另一个观察者来恢复。如果我这样做了,iTunes 在恢复时多次提示我会出现一些奇怪的行为。在 SO 帖子中,我看到有人提到删除观察者。如果我在应用程序委托级别创建它,您什么​​时候会这样做?

也许我的 SKPaymentQueue * paymentQueue 对象不是 defaultQueue 对象????不知道....

您始终需要在应用程序生命周期的早期添加您的事务观察器。您无法控制的操作可能导致交易无法完成,OS 级别队列会将这些重新提供给您的应用程序。我想不出任何常见的、合法的理由来移除观察者。

你只需要一个观察者,这个观察者应该是处理所有 IAP 事件的看门人。

您还需要确保对每笔合法完成的交易都调用 finish。如果不这样做,您最终可能会将大量重复的(从 SKU 角度来看)交易堆叠在一起。