Swift2 iOS-注销当前用户并创建新用户可保留旧用户';s新用户的默认值

Swift2 iOS-注销当前用户并创建新用户可保留旧用户';s新用户的默认值,ios,swift,boolean,nsuserdefaults,backend,Ios,Swift,Boolean,Nsuserdefaults,Backend,我正在为我的项目使用模拟器。当用户登录时,我使用NSUserDefaults来确定他们将进入哪个级别。例如 杰克下载了我的应用程序,创建了一个帐户,从一级开始,买了一些魔法,因为他买了魔法,他现在可以跳过一级了。杰克现在处于2级并退出游戏。一旦杰克注销并重新登录,他现在将降落在2层 在LevelOneVC中有一个buyMagic按钮,用于神奇的购买/级别跳过 在Signenvc中,我使用NSUserDefaults.standardUserDefaults().boolForKey来确定是否购买

我正在为我的项目使用模拟器。当用户登录时,我使用
NSUserDefaults
来确定他们将进入哪个级别。例如

杰克下载了我的应用程序,创建了一个帐户,从一级开始,买了一些魔法,因为他买了魔法,他现在可以跳过一级了。杰克现在处于2级并退出游戏。一旦杰克注销并重新登录,他现在将降落在2层

在LevelOneVC中有一个buyMagic按钮,用于神奇的购买/级别跳过

在Signenvc中,我使用
NSUserDefaults.standardUserDefaults().boolForKey
来确定是否购买了该魔法,在这种情况下,它是
真的
,这将决定将Jack发送到哪个级别。该布尔值在登录按钮中访问

吉尔是杰克的朋友,她借用了杰克的手机,创建了一个帐户,她一登录就进入了2级。她应该在1级着陆,因为她是一个不同的用户,显然有不同的
Firebase uid
,然后是Jack(我打印了它们以确保)

我使用
Firebase
作为后端,它成功地将用户登录和注销,并且他们都得到不同的
uid
。但是,由于我使用的是模拟器,因此似乎正在记录
NSUserDefault
值,无论哪个用户登录,他们都将获得以前的用户值

我还尝试在注册VC中将
bool
改回false,但所做的只是吉尔注销,杰克重新登录,他再次从1级开始

仅供参考,让我澄清一下,我在
NSUserdefaults
中保存的唯一价值是他们是否购买了魔法,而不是他们的电子邮件或购买信息等

我想这些问题将适用于任何其他特定于设备的信息,例如用户可以为我的应用程序指定的特定背景颜色或字体。我不认为这是
服务器端数据
,而是将它们保存在
NSUserDefaults

我应该保存他们是否在NSUserDefaults或我的Firebase后端购买了魔法的信息吗?我哪里出错了?

吉尔在第二层着陆是因为她使用的是同一台设备吗?

在使用后端之外,我如何获取它,以便在多个用户使用同一设备时,一旦1个用户注销,以前值中的其他日志将不会被保存

顺便说一句,我还尝试使用带有
全局bool变量的
单例类
,但出现了相同的问题。我没有包括在内

AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate {
      //this is initially a false value
      NSUserDefaults.standardUserDefaults().boolForKey("wasMagicBought")
}
符号

SignInController: UIViewController{

let magicPurchased = NSUserDefaults.standardUserDefaults().boolForKey("wasMagicBought")

@IBAction func signIn(sender: UIButton){
   //firebase method to sign user in and handler with async_brings them inside based off of the NSUserDefaults value
   dispatch_async(dispatch_get_main_queue()){
     if magicPurchased{
       //function to bring them to level 2
    }else{
      //function to bring them to level 1
      //If it's their first time making an account or if they made an account but never made it pass level 1 without buying magic this should always run i.e. Jill.
    }
   }
  }
}
LevelOneVC

LevelOneController: UIViewController{

@IBAction func buyMagic(sender: UIButton){
     self.skipLevelOne()
   }

   func skipLevelOne(){
    self.buyMagic()
    //since they bought the magic I now log it in NSUserDefaults as true
    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "wasMagicBought") 
   }

 func buyMagic(){
    //code for the user to purchase the magic allows them to skip to level 2
   }
}
注册VC 注册控制器:UIViewController{

@IBAction func signUp(sender: UIButton){
     //code to sign user up
     NSUserDefaults.standardUserDefaults().setBool(false, forKey: "wasMagicBought")
   }

}

注册用户的游戏到达级别应更新为后端API。你们永远不应该依赖于在应用程序中维护它们

if let gameLevel = user["gameLevel"] as? Int {  // user is a payload received from API
    // if gameLevel is 2, user should be moved to 2nd level
    // and similarly check if magicBought is true
}
在Swift 3中,当用户注销时,可以从NSUserDefaults中删除该值,也可以将其更改为false

UserDefaults.standard.set(false, forKey: "wasMagicBought")
UserDefaults.standard.synchronize() // use this to save the updates immediately


注册用户的游戏达到级别应更新为后端API。你们永远不应该依赖于在应用程序中维护它们

if let gameLevel = user["gameLevel"] as? Int {  // user is a payload received from API
    // if gameLevel is 2, user should be moved to 2nd level
    // and similarly check if magicBought is true
}
在Swift 3中,当用户注销时,可以从NSUserDefaults中删除该值,也可以将其更改为false

UserDefaults.standard.set(false, forKey: "wasMagicBought")
UserDefaults.standard.synchronize() // use this to save the updates immediately


实际上,我认为这种类型的数据(购买)应该由后端保存。由于许多原因,将密钥存储在本地是不安全的:其中一个原因是您需要在新用户登录时删除此密钥,这意味着您将丢失前一个密钥的所有数据

按照马特说的做,如果杰克再次登录,他将再次从1级开始

您可以决定是将这些数据保存在Firebase上,还是构建一个更复杂的数据来存储,比如一个以用户id为键的字典

purchaseDictionary: [String: Bool] = [
    jackId: true,
    jillId: false
]

如果你决定<代码> NSUDER Debug 方式,你应该考虑,如果<代码>杰克<代码>将卸载应用程序或更改iPhone,他将丢失任何数据。

实际上,我认为这种类型的数据(购买)应该由后端保存。由于许多原因,将密钥存储在本地是不安全的:其中一个原因是您需要在新用户登录时删除此密钥,这意味着您将丢失前一个密钥的所有数据

按照马特说的做,如果杰克再次登录,他将再次从1级开始

您可以决定是将这些数据保存在Firebase上,还是构建一个更复杂的数据来存储,比如一个以用户id为键的字典

purchaseDictionary: [String: Bool] = [
    jackId: true,
    jillId: false
]

如果你决定<代码> NSUDER Debug 方式,你应该考虑,如果<代码>杰克<代码>将卸载应用程序或更改iPhone,他将松开任何数据。

< P>对于有此问题的任何其他人,不要使用NSULSDER故障来保存游戏级别。马特和卢卡·达阿尔贝蒂说的都是对的

@马特 注册用户的游戏访问级别应更新为后端API。您永远不应该依赖于在应用程序中维护它们。

@卢卡·阿尔贝蒂 实际上,我认为这种类型的数据(购买)应该由后端保存。将密钥存储在本地是不安全的,原因有很多:其中一个原因是您需要在新用户登录时删除此密钥,这意味着您将丢失前一个密钥的所有数据。


向上投票选择其中一个。

对于其他有此问题的人,不要使用NSUserDefaults保存游戏级别。马特和卢卡·达阿尔贝蒂说的都是对的

@马特 注册用户的游戏访问级别应更新为后端API。您永远不应该依赖于在应用程序中维护它们。

@卢卡·阿尔贝蒂 实际上,我认为这种类型的数据(购买)应该由后端保存。在本地存储这些密钥是不安全的,原因有很多:其中一个原因是您需要在任何时候新的u