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

Posted

技术标签:

【中文标题】如何正确恢复应用内购买?【英文标题】:How to restore in-app purchases correctly? 【发布时间】:2017-08-18 21:13:01 【问题描述】:

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

sn-p 代码如何检查用户是否进行了购买?我没有看到任何 if 语句。我假设可能 restoreCompletedTransactions() 触发 paymentQueueRestoreCompletedTransactionsFinished(),但我不确定?然而,即使有,paymentQueueRestoreCompletedTransactionsFinished() 如何检查玩家是否进行了这些交易? 如果有多个应用内购买,现在如何恢复?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

这实际上是解决方案。我一直想知道这个解决方案。谢谢奥利维亚。投票! 假设我有 4 种产品要购买,为此我给出了 4 个“购买”按钮。我是否需要提供 4 个“恢复”按钮(在每个“购买”按钮旁边)?还是只显示 1 个恢复按钮会起作用?【参考方案2】:

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

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

【讨论】:

以上是关于如何正确恢复应用内购买?的主要内容,如果未能解决你的问题,请参考以下文章

iOS苹果内购(详细步骤)

Unity 之 Mac App Store 内购过程解析(购买非消耗道具 | 恢复购买 | 支付验证)

Unity 之 Mac App Store 内购过程解析(购买非消耗道具 | 恢复购买 | 支付验证)

google应用内购(in app billing),点击购买无响应

应用内购买不起作用

如何查看 ios 游戏内购消费订单?