应用内购买成功(。购买),调用函数但变量不保持其新值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用内购买成功(。购买),调用函数但变量不保持其新值相关的知识,希望对你有一定的参考价值。

我在Xcode中在Swift 4上设置我的In App Purchase时遇到问题。

购买顺利完成,我知道这是因为以下内容已打印到控制台中。

“将产品添加到付款队列

购买了com.taptrudel.ZenHangman.Zap

产品ID:com.taptrudel.ZenHangman.Zap

给用户10个zaps,新的zap计数:13

numberOfZaps = 3“

extension IAPService: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        print(transaction.transactionState.status(), transaction.payment.productIdentifier)
        switch transaction.transactionState {
        case .purchasing, .deferred: break // do nothing
        case .purchased:
            queue.finishTransaction(transaction)
            givePurchasedProduct(productID: transaction.payment.productIdentifier)
        case .restored:
            self.restorePurchase()
            queue.finishTransaction(transaction)

       case .failed:
            queue.finishTransaction(transaction)

        }
    }
}
}

一旦购买状态变为.purchased,上面的扩展调用givePurchasedProduct(productId:String)

该功能就在这里,它只是将productId传递给我的游戏场景中的一个功能,该功能将为用户提供他刚刚购买的消耗品。

func givePurchasedProduct(productID: String) {

        guard let gameScene = GameScene(fileNamed: "GameScene") else { return }
        gameScene.givePurchasedProduct(productId: productID)
    }

现在,如果你看下面我们在我的GameScene。

func givePurchasedProduct(productId: String) {
        print("ProductID : (productId)")
        if productId.range(of: "Zap") != nil {
            numberOfZaps += 10
            print("Gave user 10 zaps, new zap count: (numberOfZaps)")
            // TODO: CALL SAVE DATA HERE
        }
    }

如果您从我在此帖子顶部粘贴的控制台返回消息,您将看到

  1. 购买状态变为.purchased
  2. 调用givePurchasedProduct()
  3. 我们成功地将(10)zaps(用户以3开头)添加到numberOfZaps变量的总共(13)。
  4. 在此之后,我立即在任何地方触摸背景,这样就可以打印出zaps的数量,以确保一切正常。正如你所看到的......在添加10个zaps和打印zaps数量之间没有任何动作,我似乎已经失去了它们... numberOfZaps立即被设置回3。
  5. 每次我设置“numberOfZaps”来尝试识别问题时我搜索了我的整个项目,尽管它只在我的游戏场景的顶部设置了一次与其他变量。
  6. 因为我几天来一直在努力解决这个问题,所以我无望。我唯一能想到的是,鉴于这些是沙箱测试购买,变量以某种方式恢复到其原始值,因为实际上没有实际付款

感谢你花费数百万的时间

PS。我只是注意到,如果我使用(2)“zaps”例如。让我(1)从原始(3)中删除每个用户。

初始化如下所示。

class GameScene: SKScene {

    var level = 1

    var gameStarted = false

    var numberOfZaps = 3

虽然我买了(10)更多的zaps。

预期的行为是看到用户现在有(11)zaps

虽然我的控制台告诉我,我们在购买后再次(13)zaps。因此,无论计数器当前在哪里,它似乎都会将原始值3加10。

但是像往常一样,在我点击确认我的新zaps之后立即点击,当我检查numberOfZaps时我们又回到了(3)。 (不是13,不是11 ..)

我真的不知道我还能在这做什么。

numberOfZaps被修改的唯一时间是3个不同的地方

1)一旦它在我的gameScene顶部初始化

2)当用户购买(10)zaps时,我将(10)添加到numberOfZaps

3)当用户在一个级别中使用zap时,我从numberOfZaps中减去(1)

当我减去(1)zap时,计数器完美地工作并保持数据,尽管当我添加(10)zaps而不管计数器当前在哪里时,我最终得到(13)zaps足够的时间来打印我的语句,一旦我离开这个功能,我的zaps就会回到(3)。

出于这个原因,我也尝试添加“自我”。在“numberOfZaps”之前确保我引用了变量的正确实例。

谢谢!

答案

givePurchasedProduct函数中,您正在创建一个新的GameScene实例,更改其zaps数,然后丢弃GameScene对象。任何其他GameScene对象,表面上控制着你的应用程序显示的真实游戏场景,都不会被修改。

以上是关于应用内购买成功(。购买),调用函数但变量不保持其新值的主要内容,如果未能解决你的问题,请参考以下文章

跨两个应用保持应用内购买?

即使在卸载后仍保持贝宝应用内购买

亚马逊应用内购买 API 版本 1.0 和 2.0 Android 之间的区别

iOS - 并非我所有的应用内购买都显示在 iTunesConnect 中

我们可以在属于同一开发者帐户的应用之间共享应用内购买吗?

App Rejected - Uploaded new binary - In App Purchase - 需要开发人员操作 - 等待审核