iOS的SKPayment addTransactionObserver& defaultqueue,故事是什么?

时间:2015-03-27 00:12:51

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

如果我需要添加一个事务观察器,并且我需要删除事务观察器以及所有这些是什么,我正在努力...

我继承的代码包括带有观察者的app委托...... 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帖子中,我看到有人提到要删除观察者。如果我在app delegate级别创建它,你什么时候会这样做?

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

1 个答案:

答案 0 :(得分:2)

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

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

您还需要确保在每次合法完成的交易中都要完成。如果你不这样做,你可以最终堆叠大量重复的(从SKU角度来看)交易。