2017-04-15 2 views
0

L'utilisateur a la possibilité d'acheter des "pièces" qui peuvent ensuite être utilisées pour acheter un type de véhicule différent à utiliser pendant le jeu.Swift In App Achat pour augmenter une valeur UserDefault n'a pas été actualisé jusqu'à ce que l'application recharge

C'est le code de l'application dans l'achat de pièces:

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 

     } 
    } 
} 

Cet achat fonctionne parfaitement et le coinScore augmentera une fois l'achat est terminée. Le problème est que lorsque le coinScore est suffisant pour que le joueur achète ensuite un véhicule, il ne semble pas enregistrer le coinScore augmenté jusqu'à ce que la vue soit chargée en rechargeant l'application ou en changeant les scènes et en revenant.

Le coinScore est ajouté en tant que variable si:

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

Ceci est le code qui permet au joueur d'acheter un véhicule:

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 
      } 

Après l'achat, bien que la valeur coinScore indiquée dans la vue est mise à jour immédiatement, l'utilisateur ne peut alors cliquer sur greyShip2 pour l'acheter jusqu'à ce que l'application soit actualisée.

Répondre

1

content que vous ayez trouvé la solution. Je voudrais juste suggérer une meilleure façon de lire et d'écrire à 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) 
} 

} 

Cela vous évite la peine de créer des instances de UserDefaults chaque fois que vous lire et écrire it.You peuvent désormais accéder directement à cette variable à lire et à écrire à ce it.Hope aide

0

J'ai réussi à résoudre le problème.

Il semble que la variable coinScore ne soit pas mise à jour immédiatement.

Ce que je l'ai fait est le changement:

if coinScore > 20 { 

à

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

Espérons que quelqu'un peut développer ma réponse.