SKPaymentTransaction.transactionState总是.restored。

问题描述 投票:0回答:2

我正在测试我的应用程序自动续费订阅,但。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)
}
ios swift storekit skpaymenttransaction
2个回答
0
投票

可能,它总是 .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 对应于它的事务的实例,也许不存在,或者不是同一个。

所以它表现得很狼狈。


0
投票

我在这里发现。清理SKPAymentsQueue 。迫使未完成的事务完成 我的问题是我有一些未完成的待处理交易,所以我把这个添加到我的 viewDidLoad 来 "强制 "完成它们。我是否应该将其永久收录以避免再次发生?

let currentQueue: SKPaymentQueue = SKPaymentQueue.default();
for transaction in currentQueue.transactions {
    currentQueue.finishTransaction(transaction);
}
© www.soinside.com 2019 - 2024. All rights reserved.