我正在测试我的应用程序的自动续订订阅,但SKPaymentTransaction.transactionState从不更改为.purchased,它始终是.restored。一切正常,但是自从我第一次调用SKPaymentQueue.default().restoreCompletedTransactions()以来,除了.restored什么也得不到。我尝试从我的iPhone中删除应用程序,重新登录到我的沙盒帐户,创建一个新的沙盒帐户,重新启动Xcode,清理build文件夹,...我哪里做错了?请在下面找到我的代码:
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
switch transaction.transactionState {
case .purchased:
SKPaymentQueue.default().finishTransaction(transaction)
print(".purchased")
case .failed:
SKPaymentQueue.default().finishTransaction(transaction)
print(".failed")
case .restored:
SKPaymentQueue.default().finishTransaction(transaction)
print(".restored")
default:
break
}
}
}
@IBAction func restore(_ sender: UIBarButtonItem) {
SKPaymentQueue.default().restoreCompletedTransactions()
}
func subscribe() {
if SKPaymentQueue.canMakePayments() {
let payment = SKPayment(product: availableProducts[indexPath.row])
SKPaymentQueue.default().add(payment)
}
}
override func viewDidLoad() {
super.viewDidLoad()
SKPaymentQueue.default().add(self)
}发布于 2020-05-12 14:37:23
可能,它总是.restored,因为transaction还没有完成。
通常我们将SKPaymentQueue.default().add(observer)放在AppDelegate中,
以使事务始终得到处理。
class AppDelegate{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
SKPaymentQueue.default().add(self)
}
}
extension AppDelegate: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
// ...
}
}当你把SKPaymentQueue.default().add(observer)放在ViewController中时,因为ViewController可能会被推送和弹出。
也就是说,ViewController实例被分配和释放。
因为事务处理是异步的,所以对应于它的事务的ViewController实例可能不存在,或者不是同一个实例。
所以它表现得很有女人味。
发布于 2020-05-12 20:26:56
我在这里发现:Clearing SKPAymentsQueue : Forcing Unfinished Transactions To Finish我的问题是我有一些未完成的未决事务,所以我在我的viewDidLoad中添加了这个,以“强制”完成所有这些事务。我是否应该永久包含它,以避免再次发生这种情况?
let currentQueue: SKPaymentQueue = SKPaymentQueue.default();
for transaction in currentQueue.transactions {
currentQueue.finishTransaction(transaction);
}发布于 2021-05-08 17:06:43
应该检查队列的结果
let transactions = queue.transactions
if transactions.count > 0 {
for transaction in queue.transactions {
if (transaction.transactionState == SKPaymentTransactionState.failed) {
//possibly handle the error
purchaseStatusBlock?(.failed)
} else if (transaction.transactionState == SKPaymentTransactionState.purchased) {
//deliver the content to the user
purchaseStatusBlock?(.purchased)
} else if (transaction.transactionState == SKPaymentTransactionState.restored) {
//deliver the content to the user
purchaseStatusBlock?(.restored)
} else {
//handle other transaction states
}
}
} else {
purchaseStatusBlock?(.failed)
}https://stackoverflow.com/questions/61740141
复制相似问题