我正在测试我的应用程序自动续期订阅,但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)
}