我正在测试我的应用程序自动续费订阅,但。SKPaymentTransaction.transactionState
不变 .purchased
而且它总是 .restored
. 一切都在正常工作,但我可以得到什么,但。.restored
自从我第一次打电话给 SKPaymentQueue.default().restoreCompletedTransactions()
. 我试着从我的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
实例得到分配和deallocated。
由于事务处理是异步的,所以 ViewController
对应于它的事务的实例,也许不存在,或者不是同一个。
所以它表现得很狼狈。
我在这里发现。清理SKPAymentsQueue 。迫使未完成的事务完成 我的问题是我有一些未完成的待处理交易,所以我把这个添加到我的 viewDidLoad
来 "强制 "完成它们。我是否应该将其永久收录以避免再次发生?
let currentQueue: SKPaymentQueue = SKPaymentQueue.default();
for transaction in currentQueue.transactions {
currentQueue.finishTransaction(transaction);
}