Swift In App Purchase增加UserDefault值并未刷新,直到app重新加载

时间:2017-04-15 00:43:24

标签: ios swift nsuserdefaults

用户可以选择购买"硬币"然后可以用来购买在比赛期间使用的不同类型的车辆。

这是应用内购买硬币的代码:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {

    for transaction in transactions {

        switch (transaction.transactionState) {

        case .purchased:
            SKPaymentQueue.default().finishTransaction(transaction)
            print("Purchased")

            let oldCoin = UserDefaults.standard.integer(forKey: "COINSCORE")
            let newCoin = oldCoin + 500

            UserDefaults.standard.set(newCoin, forKey: "COINSCORE")
            UserDefaults.standard.synchronize()
            coinLabel.removeFromParent()                
            createCoinScore()

            // apply purchased here and store info in userDefaults
        case .failed:
            SKPaymentQueue.default().finishTransaction(transaction)
            print("Failed")
        default:
            break

        }
    }
}

此次购买完美无缺,购买完成后,coinScore将会增加。

问题在于,当coinScore足以让玩家购买车辆时,它似乎无法注册增加的coinScore,直到通过重新加载应用程序或更改场景并返回来加载视图。

coinScore作为变量添加如下:

    var coinScore = UserDefaults().integer(forKey: "COINSCORE")

这是允许玩家购买车辆的代码:

 if(atPoint(location) == greyship2){

            if coinScore > 20 {
                let oldValue = UserDefaults.standard.integer(forKey: "COINSCORE")
                let newValue = oldValue - 20

                UserDefaults.standard.set(newValue, forKey: "COINSCORE")
                UserDefaults.standard.set(true, forKey: "ship2")
                UserDefaults.standard.synchronize()

                coinLabel.removeFromParent()
                coinImage1.removeFromParent()
                coinLabel1.removeFromParent()

                createCoinScore()



                greyship2.setScale(0)
                greyship2.removeFromParent()

                let ship2Texture = SKTexture(imageNamed: "ship2.png")
                ship2 = SKSpriteNode(texture: ship2Texture)
                ship2.position = CGPoint(x: self.frame.midX - 150, y: self.frame.midY)
                ship2.setScale(1)
                self.addChild(ship2)
                break //finish the touchesbegan call
            }

购买后,虽然视图中显示的coinScore值确实立即更新,但用户无法再单击greyShip2进行购买,直到应用程序刷新为止。

2 个答案:

答案 0 :(得分:1)

很高兴你找到了解决方案。我想建议一种更好的方式来读写UserDefaults。

    var <anyVariableName>: String!{
get {
    var value = ""
    if NSUserDefaults.standardUserDefaults().valueForKey( UserDefaultsKey.USER_ID_STORED) != nil {
        value = NSUserDefaults.standardUserDefaults().valueForKey( UserDefaultsKey.USER_ID_STORED)  as! String
    }
    return value
}

set(value) {
    NSUserDefaults.standardUserDefaults().setValue(value, forKey: UserDefaultsKey.USER_ID_STORED)
}

}

这样可以省去每次读取和写入时都创建UserDefaults实例的麻烦。您现在可以直接访问此变量来读取和写入它。希望这有帮助

答案 1 :(得分:0)

我设法解决了这个问题。

看来coinScore变量并没有立即更新。

我所做的就是改变:

if coinScore > 20 {

if UserDefaults().integer(forKey: "COINSCORE") > 20 {

希望有人可以扩展我的答案。