首页 文章

如何正确恢复应用内购买?

提问于
浏览
1

我有几个应用内购买 . 但是,我读到我需要提供一种方法来恢复它们,以防他们意外删除我的应用程序 . 它们是不可消耗的物品,如皮肤和纹理 . 我正在阅读本网站上的教程:https://code.tutsplus.com/tutorials/in-app-purchase-tutorial-with-swift-3-ios-sdk--cms-27595

但是,他们对恢复交易的解释使我感到困惑 . 他们这样做了:

@IBAction func restorePurchaseButt(_ sender: Any) {
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
nonConsumablePurchaseMade = true
UserDefaults.standard.set(nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade")

UIAlertView(title: "IAP Tutorial",
message: "You've successfully restored your purchase!",
delegate: nil, cancelButtonTitle: "OK").show()
}

但是,他们从未向我展示他们实际使用paymentQueueRestoreCompletedTransactionsFinished()的位置 . 我知道他们正在使用restorePurchaseButt()来恢复购买 . 但是,我不理解这两种方法 .

SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()

How does that snippet of code even check if the user made the purchase? 我没有看到任何if语句 . 我假设也许restoreCompletedTransactions()触发paymentQueueRestoreCompletedTransactionsFinished(),但我不确定?但是,即使它确实如此, paymentQueueRestoreCompletedTransactionsFinished() 如何检查玩家是否进行了这些交易? How does it now what in-app purchases to restore when there are multiple?

2 回答

  • 0

    正如您在要恢复的按钮中所做的那样,您需要添加:

    SKPaymentQueue.default().add(self)
    SKPaymentQueue.default().restoreCompletedTransactions()
    

    然后,您还需要使用iTunesConnect中的不同应用内购买添加此功能 . 将案例的“ProductID”更改为iTunesConnect中的产品ID,并添加与应用内购买一样多的案例 .

    func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
        for transaction in queue.transactions {
            let t: SKPaymentTransaction = transaction
            let prodID = t.payment.productIdentifier as String
    
            switch prodID {
            case "ProductID1":
                // implement the given in-app purchase as if it were bought
            case "ProductID2":
                // implement the given in-app purchase as if it were bought
            default:
                print("iap not found")
            }
        }
    }
    

    回答你的问题:看起来你正在关注的这个特定的教程专注于教你应用内购买的总体想法,并使用他们的示例购买而不是可用于多种产品的代码 .

    Apple检查该项是否先前通过您在按钮时调用的restoreCompletedTransactions()函数购买 . 这是Apple提供的StoreKit框架的一部分 . 它一旦检查就会自动触发paymentQueueRestoreCompletedTransactionsFinished()函数 . 使用上面提供的代码,它根据找到的购买执行不同的代码,如果找不到要恢复的产品,则会打印到控制台 .

  • 10

    我不能说教程,但我会说处理购买是一件非常敏感的事情 . 你可以自己实现它,但我会敦促你尝试使用库而不是 . 我使用SwiftyStoreKit,它处理了很多边缘情况和细微差别 . https://github.com/bizz84/SwiftyStoreKit

    从那里恢复你当然现在必须检查哪些产品被恢复并从那里继续

相关问题