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

Dav*_*vid 5 objective-c in-app-purchase ios

我有两个地方,当我发起相同的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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当用户完成事务时,永远不会调用此方法.

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

有任何想法吗?

谢谢

Lom*_*baX 4

您可能在上述两个控制器之一中设置了错误的事务观察器(或未设置)。

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

[[SKPaymentQueue defaultQueue] addTransactionObserver:something];
Run Code Online (Sandbox Code Playgroud)

其中something可以是self(如果你的paymentQueue:updatedTransactions:方法是 on self)或另一个对象。

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

假设您有两个控制器:

UserOnboardingController
UpgradeController

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

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
Run Code Online (Sandbox Code Playgroud)

paymentQueue:updatedTransactions:的方法之一UpgradeController

但是,当您处于 on 状态时UserOnboardingController,您不会调用错误的观察者或将错误的观察者传递给addTransactionObserver:方法。

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

  • 从 ViewController 层次结构中检索正确的观察者并作为观察者传入
  • 将事务观察器的代码移动到共享类上(例如在一个AppDelegate或另一个特定的单例类上)