自从iOS 13.4以后,购买对话框没有显示出来。

7

自从 iOS 13.4 版本,当应用程序在屏幕底部显示某行时,应用内购买对话框将不会出现...

[[SKPaymentQueue defaultQueue] addPayment:payment]; 

...已执行。

iOS 13.4之前,会弹出一个对话框来确认购买,但现在没有了。 有人知道可能是什么原因引起的吗?

注:

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

1
不,还没有。你有同样的问题吗? - Viktor Sehr
1
是的,我有,只是它不会显示购买对话框。在iOS 13.3.1上运行得非常好。 - Daniele
1
我正在使用Flutter,并且我打开了这个问题。根本问题似乎是相同的。因此,如果您想检查它,请在此处留下链接https://github.com/flutter/flutter/issues/53534 - Daniele
很好,请在那里收到反馈后在这里更新。一个区别是对话框根本不会显示出来(根据您的问题描述,它至少会显示一次)。 - Viktor Sehr
你看到这个事务的状态是否被设置为失败或其他状态了吗? - Viktor Sehr
显示剩余2条评论
4个回答

6

尝试完全“刷新”队列:

    - (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;
            }
*/
        }
    }

然后将其替换为您的代码,尝试进行购买。


1
之后,我成功地使购买对话框正确弹出,但只有在清除交易后的第一次。太棒了!我们接近成功了!现在看起来,在iOS 13.4上finishTransaction没有被调用。你有什么想法如何解决它吗? - Daniele
2
实际上,你应该总是自己“完成交易”。我已经更新了答案以使其更清晰。 - Gabiden

5

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

在我们的情况下,旧代码没有调用SKPaymentQueue.default().finishTransaction(transaction)来将其从队列中删除。在iOS 13.4之前,尽管文档要求这样做,但显然没有问题。

所以会发生的是,对话框会显示一次,人们会取消,从那时起,交易将在队列中持续存在,并自动返回为取消状态,而无需再次显示对话框。完成交易会清除它并允许对话框再次显示。


如果这样不起作用:

按照苹果工程师的要求,我使用App Store日志和sysdiagnose提交了一个雷达报告(FB7648374)

请您也这样做:


1
非常感谢您。我也提交了一份报告。 - Viktor Sehr

1
我曾经遇到过同样的问题,这是我的解决方法。
对于每个购买交易,请执行以下操作:
1- 删除所有IAPPayment和IAPProductRequest。
func reset() {
    requests.removeAll()
    payments.removeAll()
}

2- 移除所有交易。

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

-1

你也可以尝试重新启动设备


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接