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

In-App Purchase is successful (.purchased), function is called but the variable does not maintain its new value

我在 Xcode 的 Swift 4 上设置我的应用内购买时遇到问题。

购买成功,我知道是因为控制台打印了下面的内容。

"正在将产品添加到付款队列

已购买 com.taptrudel.ZenHangman.Zap

产品编号: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
        }
    }

如果您 return 从我粘贴在此 post 顶部的控制台消息,您将看到

  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) 的 zap,每个用户都得到了。

初始化如下所示。

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 return 到 (3).

出于这个原因,我还尝试在 "numberOfZaps" 之前添加 "self." 以确保我引用了正确的变量实例。

谢谢!

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