InApp购买 - paymentQueue:不会从特定位置调用updatedTransactions

时间:2017-04-13 08:50:47

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

当我发起相同的UIView并且有可能购买InApp可购买产品时,我有两个地方。 1.用户入职结束 2.菜单中的标准位置

从第一个开始付款我通过SKPaymentTransactionStatePurchasing到达updatedTransactions:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray     *)transactions
{
  DLog(@"updatedTransactions");
  for (SKPaymentTransaction *transaction in transactions)
  {
    switch (transaction.transactionState)
    {
        case SKPaymentTransactionStatePurchased:
            // I get here when the controller is initiated from menu, not from my user onboarding
            break;
        case SKPaymentTransactionStateFailed:
            [self failedTransaction:transaction];
            break;
        case SKPaymentTransactionStateRestored:
            [self restoreTransaction:transaction];
            break;
        case SKPaymentTransactionStatePurchasing:
            // I get here
            break;
        default:
            break;
    }
  }
}

但是当用户完成交易时,永远不会调用此方法。

当我从菜单启动相同的控制器时,一切正常。

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:2)

可能你在两个提到的控制器之一中设置了错误的事务观察者(或没有设置它)。

为了在事务更新时接收通知,您必须以这种方式添加观察者:

[[SKPaymentQueue defaultQueue] addTransactionObserver:something];

其中something可以self(如果您的paymentQueue:updatedTransactions:方法在self上)或其他对象。

如果您发布两个控制器的相关代码(控制器名称和上面提到的addTransactionObserver:方法的调用加上一些上下文),我可以给你更多的信息,但在那之前我可以做一些假设。

假设您有两个控制器:

UserOnboardingController
UpgradeController

你说在UpgradeController中它正常工作,这可能是因为当加载控制器时(例如在viewDidLoad:中)有一个调用

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

paymentQueue:updatedTransactions:UpgradeController的方法之一。

但是,当您使用UserOnboardingController时,您无法通过addTransactionObserver:方法致电或传递错误的观察者。

如果是这种情况,你应该:

  • 从ViewController层次结构中检索正确的观察者并以观察者身份传入
  • 在共享类上移动事务观察者的代码(例如在AppDelegate或其他特定单例类上)