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



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

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

在LevelOneVC中有一个buyMagic按钮,用于魔术购买/级别跳过。

在SignInVC中,我使用NSUserDefaults.standardUserDefaults().boolForKey来确定是否购买了魔法,在这种情况下是true,这将决定将Jack发送到哪个级别。这个布尔值在signInButton中访问。

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

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

我还尝试在SignUpVC中将bool改回false,但Jill注销后,Jack重新登录,他又开始了1级。

仅供我澄清,我在NSUserdefaults中节省的唯一价值是他们是否购买了魔法,而不是他们的电子邮件或购买信息等。

我想这些问题适用于任何其他特定于设备的信息,比如用户可以为我的应用程序指定的特定背景颜色或字体。我不认为那会是server side data,我会把它们保存在NSUserDefaults中。

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

Jill降落在2级是因为她使用了完全相同的设备吗

除了使用后端,我如何获得它,以便如果多个用户使用同一设备,并且一旦1个注销,则不会保存以前值中的其他日志

顺便说一句,我也试过用singleton classglobal bool variable,但出现了同样的问题。我没有包括它

AppDelegate:

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

SignInVC

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
}
}

注册VCSignUpController:UIViewController{

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

}

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

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

你可以决定是否将这些数据保存在Firebase上,或者你可以构建一个更复杂的数据来存储,比如一个字典,它的密钥是用户id

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

如果你决定NSUserDefaults的方式,你应该考虑,如果Jack将卸载应用程序或更改iPhone,他将丢失任何数据。

注册用户的游戏达到级别应更新到后端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

UserDefaults.standard.removeObject(forKey: "MyKey")
UserDefaults.standard.synchronize()

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

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

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

投票支持他们中的任何一个。

相关内容

最新更新