【问题标题】:The purchase dialog does not show up since iOS 13.4自 iOS 13.4 起,购买对话框不再显示
【发布时间】:2020-03-28 22:31:29
【问题描述】:

iOS 13.4开始,应用内购买的对话框在行时不显示...

[[SKPaymentQueue defaultQueue] addPayment:payment]; 

...被执行。

iOS 13.4 之前出现了一个对话框弹出窗口,用户确认购买,但现在什么也没有。 有谁知道是什么导致了这个问题?

注意事项:

  • 这是一款基于 libSDL 和 gles 3.0 的全屏游戏。
  • 虽然 99% 的代码库是 C++,但应用内购买是用 Objective C++ 进行的
  • 它在 iOS 13.4 之前工作

【问题讨论】:

  • 您是否碰巧找到了解决此问题的方法?
  • 不,还没有。你有同样的问题吗?
  • 是的,只是不会显示购买对话框。它在 iOS 13.3.1 上运行良好
  • 我正在使用颤振,我打开了这个问题。潜在的问题似乎是相同的。所以如果你想查看的话,我会把链接留在这里github.com/flutter/flutter/issues/53534
  • 太好了,如果您在此处获得反馈,请在此处提供更新。一个区别是对话框根本不显示(阅读您的问题,它似乎至少为您显示一次)

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


【解决方案1】:

尝试一次完全“刷新”队列:

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 
        for (SKPaymentTransaction *transaction in transactions) {

        //debug - finish all transactions to make queue empty  
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
/*
            switch (transaction.transactionState) {
                case SKPaymentTransactionStatePurchased:
                     //your code 
                     [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                     break;

                case SKPaymentTransactionStateFailed:
                    //your code 
                    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                    break;
            }
*/
        }
    }

然后用您的代码替换它并尝试购买。

【讨论】:

  • 在那之后,我能够正确弹出购买对话框,但只是在刷新交易后的第一次。惊人的!我们很接近了!现在,看起来finishTransaction 在 iOS 13.4 上没有被调用。你知道如何解决它吗?
  • 实际上你应该总是自己“完成交易”。我已经更新了答案以明确。
【解决方案2】:

首先,确保您在成功/失败时完成交易:

在我们的例子中,旧代码没有调用 SKPaymentQueue.default().finishTransaction(transaction) 将其从队列中删除。在 iOS 13.4 之前,这显然工作得很好,即使文档说它是必需的

所以会发生的情况是对话框将显示一次,然后该人将取消,然后从那时起,事务将保留在队列中,并自动返回已取消,而不再显示对话框。完成事务会清除它并允许对话框再次显示


如果这不起作用:

根据 Apple 工程师的要求,我为此提交了一份雷达 (FB7648374),其中包含 App Store 日志记录和系统诊断

请这样做:

【讨论】:

  • 非常非常感谢。我也提交了一份报告。
【解决方案3】:

我遇到了同样的问题,我就是这样解决的。

对每笔购买交易执行以下操作。

1- 删除所有 IAPPayment 和 IAPProductRequest。

func reset() {
    requests.removeAll()
    payments.removeAll()
}

2- 删除所有交易。

func cleanTransactions() {
    reset()
    for transaction in SKPaymentQueue.default().transactions {
        SKPaymentQueue.default().finishTransaction(transaction)
    }
}

【讨论】:

    【解决方案4】:

    你也可以重启你的设备

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2020-02-17
      相关资源
      最近更新 更多