SKPaymentTransaction.transactionState is always .restored



我正在测试我的应用程序自动续期订阅,但SKPaymentTransaction.transactionState永远不会更改为.purchased,而且总是.restored。一切都很好,但自从我第一次打电话给SKPaymentQueue.default().restoreCompletedTransactions()以来,我只能得到.restored。我尝试从iPhone中删除该应用程序,重新登录我的沙盒帐户,创建一个新的沙盒帐户,重新启动Xcode,清理构建文件夹,...我做错了什么?请在下面找到我的代码:

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)
}

可能,它总是.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实例可能不存在,或者不是同一个实例。

所以它的行为很笨拙。

我在这里找到: 清除 SKPAyments队列:强制未完成的事务完成 我的问题是我有一些未完成的待处理事务,所以我将其添加到我的viewDidLoad中以"强制"完成所有事务。我是否应该永久包含它以避免它再次发生?

let currentQueue: SKPaymentQueue = SKPaymentQueue.default();
for transaction in currentQueue.transactions {
currentQueue.finishTransaction(transaction);
}

你应该检查队列的结果

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)
}

最新更新