自 iOS 13.4 起不再显示购买对话框
The purchase dialog does not show up since iOS 13.4
从 iOS 13.4 开始,应用内购买的对话框在行...
[[SKPaymentQueue defaultQueue] addPayment:payment];
...被执行。
Pre iOS13.4 在用户确认购买的地方出现了一个对话框弹出窗口,但现在什么也没有。
有谁知道可能导致此问题的原因?
备注:
- 基于libSDL和gles 3.0的全屏游戏
- 虽然 99% 的代码库是 C++,但应用内购买是在 Objective C++
中进行的
- 在iOS13.4
之前有效
尝试完全 "flush" 队列一次:
- (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;
}
*/
}
}
然后用您的代码替换它并尝试购买。
首先,确保您在 success/failure:
时完成交易
在我们的例子中,旧代码没有调用 SKPaymentQueue.default().finishTransaction(transaction)
将其从队列中删除。在 iOS 13.4 之前,这显然工作正常,即使文档说它是必需的
那么会发生什么情况,对话框会显示一次,然后该人会取消,然后从那时起,交易将保留在队列中并自动 return 取消,而不会再次显示对话框。完成交易清除它并允许对话框再次显示
如果这不起作用:
应 Apple 工程师的要求,我为此 (FB7648374) 提交了一个带有 App Store 日志记录和 sysdiagnose 的雷达
请也这样做:
- 按照 https://developer.apple.com/bug-reporting/profiles-and-logs/
上的 App Store 日志记录说明进行操作
- 在您的设备上安装启用详细日志记录的配置文件
- 然后使用设备日志 运行 在您的设备上重现问题(Xcode -> 设备 -> 控制台日志)
- 然后立即捕获系统诊断
- 在 https://feedbackassistant.apple.com/
中使用该信息提交新雷达
我遇到了同样的问题,我就是这样解决的。
对每笔购买交易执行以下操作。
1- 删除所有 IAPPayment 和 IAPProductRequest。
func reset() {
requests.removeAll()
payments.removeAll()
}
2- 删除所有交易。
func cleanTransactions() {
reset()
for transaction in SKPaymentQueue.default().transactions {
SKPaymentQueue.default().finishTransaction(transaction)
}
}
您也可以只重启设备
从 iOS 13.4 开始,应用内购买的对话框在行...
[[SKPaymentQueue defaultQueue] addPayment:payment];
...被执行。
Pre iOS13.4 在用户确认购买的地方出现了一个对话框弹出窗口,但现在什么也没有。 有谁知道可能导致此问题的原因?
备注:
- 基于libSDL和gles 3.0的全屏游戏
- 虽然 99% 的代码库是 C++,但应用内购买是在 Objective C++ 中进行的
- 在iOS13.4 之前有效
尝试完全 "flush" 队列一次:
- (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;
}
*/
}
}
然后用您的代码替换它并尝试购买。
首先,确保您在 success/failure:
时完成交易在我们的例子中,旧代码没有调用 SKPaymentQueue.default().finishTransaction(transaction)
将其从队列中删除。在 iOS 13.4 之前,这显然工作正常,即使文档说它是必需的
那么会发生什么情况,对话框会显示一次,然后该人会取消,然后从那时起,交易将保留在队列中并自动 return 取消,而不会再次显示对话框。完成交易清除它并允许对话框再次显示
如果这不起作用:
应 Apple 工程师的要求,我为此 (FB7648374) 提交了一个带有 App Store 日志记录和 sysdiagnose 的雷达
请也这样做:
- 按照 https://developer.apple.com/bug-reporting/profiles-and-logs/ 上的 App Store 日志记录说明进行操作
- 在您的设备上安装启用详细日志记录的配置文件
- 然后使用设备日志 运行 在您的设备上重现问题(Xcode -> 设备 -> 控制台日志)
- 然后立即捕获系统诊断
- 在 https://feedbackassistant.apple.com/ 中使用该信息提交新雷达
我遇到了同样的问题,我就是这样解决的。
对每笔购买交易执行以下操作。
1- 删除所有 IAPPayment 和 IAPProductRequest。
func reset() {
requests.removeAll()
payments.removeAll()
}
2- 删除所有交易。
func cleanTransactions() {
reset()
for transaction in SKPaymentQueue.default().transactions {
SKPaymentQueue.default().finishTransaction(transaction)
}
}
您也可以只重启设备