Swift 在 App Purchase 中增加 UserDefault 值在应用重新加载之前不会刷新
Swift In App Purchase to increase a UserDefault value isn't been refreshed until app reload
用户可以选择购买 "coins",然后可以使用它购买不同类型的载具,以便在游戏中使用。
这是应用内购买金币的代码:
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 进行购买。
我已经解决了这个问题。
coinScore 变量似乎没有立即更新。
我所做的是改变:
if coinScore > 20 {
至
if UserDefaults().integer(forKey: "COINSCORE") > 20 {
希望有人可以扩展我的答案。
很高兴您找到了解决方案。我只想建议一种更好的读取和写入 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 实例的麻烦 it.You 现在可以直接访问这个变量来读写 it.Hope 这有帮助
用户可以选择购买 "coins",然后可以使用它购买不同类型的载具,以便在游戏中使用。
这是应用内购买金币的代码:
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 进行购买。
我已经解决了这个问题。
coinScore 变量似乎没有立即更新。
我所做的是改变:
if coinScore > 20 {
至
if UserDefaults().integer(forKey: "COINSCORE") > 20 {
希望有人可以扩展我的答案。
很高兴您找到了解决方案。我只想建议一种更好的读取和写入 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 实例的麻烦 it.You 现在可以直接访问这个变量来读写 it.Hope 这有帮助