首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKPaymentTransaction.transactionState始终为.restored

SKPaymentTransaction.transactionState始终为.restored
EN

Stack Overflow用户
提问于 2020-05-12 05:59:42
回答 3查看 410关注 0票数 0

我正在测试我的应用程序的自动续订订阅,但SKPaymentTransaction.transactionState从不更改为.purchased,它始终是.restored。一切正常,但是自从我第一次调用SKPaymentQueue.default().restoreCompletedTransactions()以来,除了.restored什么也得不到。我尝试从我的iPhone中删除应用程序,重新登录到我的沙盒帐户,创建一个新的沙盒帐户,重新启动Xcode,清理build文件夹,...我哪里做错了?请在下面找到我的代码:

代码语言:javascript
复制
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)
}
EN

回答 3

Stack Overflow用户

发布于 2020-05-12 14:37:23

可能,它总是.restored,因为transaction还没有完成。

通常我们将SKPaymentQueue.default().add(observer)放在AppDelegate中,

以使事务始终得到处理。

代码语言:javascript
复制
 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实例可能不存在,或者不是同一个实例。

所以它表现得很有女人味。

票数 0
EN

Stack Overflow用户

发布于 2020-05-12 20:26:56

我在这里发现:Clearing SKPAymentsQueue : Forcing Unfinished Transactions To Finish我的问题是我有一些未完成的未决事务,所以我在我的viewDidLoad中添加了这个,以“强制”完成所有这些事务。我是否应该永久包含它,以避免再次发生这种情况?

代码语言:javascript
复制
let currentQueue: SKPaymentQueue = SKPaymentQueue.default();
for transaction in currentQueue.transactions {
    currentQueue.finishTransaction(transaction);
}
票数 0
EN

Stack Overflow用户

发布于 2021-05-08 17:06:43

应该检查队列的结果

代码语言:javascript
复制
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)
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61740141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档