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

时间:2017-08-18 21:13:02

标签: swift in-app-purchase

我有一些应用内购买。但是,我读到我需要提供一种方法来恢复它们,以防他们意外删除我的应用程序。它们是不可消耗的物品,如皮肤和纹理。我正在阅读本网站的教程: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()

这段代码甚至会检查用户是否进行了购买?我没有看到任何if语句。我假设也许restoreCompletedTransactions()触发paymentQueueRestoreCompletedTransactionsFinished(),但我不确定?但是,即使它确实如此, paymentQueueRestoreCompletedTransactionsFinished()如何检查玩家是否进行了这些交易? 当有多个应用内购买时,应该如何恢复?

2 个答案:

答案 0 :(得分:10)

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

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()函数。使用上面提供的代码,它会根据找到的购买执行不同的代码,如果找不到要恢复的产品,则会打印到控制台。

答案 1 :(得分:0)

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

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