在 Xcode 中注销并以新用户身份登录后,以前的用户数据仍然可见

时间:2021-02-08 09:08:51

标签: ios swift xcode

我正在尝试在我的应用程序中实现注销功能。它工作正常。但是,当我注销并以其他用户身份登录时。我仍然可以看到旧的用户信息。如何在注销时删除当前用户数据,以便当我以其他用户身份登录时,以前用户的信息不可见。我将附上我的注销代码以供参考。如果需要更多信息,请告诉我。

 @objc private func LogOutButtonTapped() {
        
        
        let actionSheet = UIAlertController(title: "Log Out", message: "Are you sure, you want to log out?", preferredStyle: .actionSheet)
        actionSheet.addAction(UIAlertAction(title: "Cancel",
                                            style: .cancel, handler: nil))
        
                                                
        actionSheet.addAction(UIAlertAction(title: "Log Out", style: .destructive,
                              handler: { [weak self] _ in
                        
                guard let strongSelf = self else {
                            return
                            }
                    
                    UserDefaults.standard.setValue(false, forKey: "email")
                    UserDefaults.standard.setValue(false, forKey: "name")
                 
                                
                                
            do {
                    try Auth.auth().signOut()
                    let vc = LoginViewController()
                    let nav = UINavigationController(rootViewController: vc)
                    nav.modalPresentationStyle = .fullScreen
                    strongSelf.present(nav, animated: true)
                    }
                    catch {
                        print("Failed to log out")
                    }
            }))
            present(actionSheet, animated: true)
}

2 个答案:

答案 0 :(得分:0)

我已更改您在注销操作块上的代码。您必须在注销时从用户默认值中删除对象

    @objc private func LogOutButtonTapped() {
    
    let actionSheet = UIAlertController(title: "Log Out", message: "Are you sure, you want to log out?", preferredStyle: .actionSheet)
    actionSheet.addAction(UIAlertAction(title: "Cancel",
                                        style: .cancel, handler: nil))
    
    
    actionSheet.addAction(UIAlertAction(title: "Log Out", style: .destructive,
                                        handler: { [weak self] _ in
                                            
                                            guard let strongSelf = self else {
                                                return
                                            }
                                            
                                            let firebaseAuth = Auth.auth()
                                            do {
                                                try firebaseAuth.signOut()
                                            } catch let signOutError as NSError {
                                                print ("Error signing out: %@", signOutError)
                                            }
                                            **remove object on logout click**
                                            USER_DEFAULT.removeObject(forKey: "email") // remove email

                                                let vc = LoginViewController()
                                                let nav = UINavigationController(rootViewController: vc)
                                                nav.modalPresentationStyle = .fullScreen
                                                strongSelf.present(nav, animated: true)
                                           

                                        }))
    present(actionSheet, animated: true)
    
}

答案 1 :(得分:0)

我认为问题在于您的登录功能。

在注销时删除第一个答案中指出的 UserDefault 值很有用。但在登录时将新对象保存到 UserDefault 并在用户配置文件视图控制器上读取这些值也是一个好主意。

登录后,使用您首选的登录方式(电子邮件登录、FB / Google 登录等)获取用户数据,并将每个详细信息保存在 UserDefaults 中。

例如:

let defaults = UserDefaults.standard
defaults.set("RandomUserName", forKey: "username")
defaults.set("someone@email.com", forKey: "email")

之后,在转到用户配置文件 VC(或您用来显示用户详细信息的任何视图控制器)时,读取并显示这些值:

let defaults = UserDefaults.standard
let username = defaults.object(forKey: "username") as? String
let email = defaults.object(forKey: "email") as? String

更新:

我检查了 GitHub 上的代码,发现它使用 Firebase 数据库作为聊天/对话的内容。代码本身具有在打开 Conversations VC 时根据用户的电子邮件重新获取对话的功能。发生的事情是,因为即使注销后旧用户的电子邮件仍然存在,因此,聊天内容也是如此。 如果在登录时保存了正确的(新用户的)电子邮件并在打开对话 VC 时调用了该应用程序,则该应用程序可能会“重新启动”,因此将获取“正确”的对话内容。

更新:

尝试在显示下一个 VC 之前添加一些延迟(未经测试):

@objc private func LogOutButtonTapped() {
    
    let actionSheet = UIAlertController(title: "Log Out", message: "Are you sure, you want to log out?", preferredStyle: .actionSheet)
    actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    actionSheet.addAction(UIAlertAction(title: "Log Out", style: .destructive, handler: { [weak self] _ in
    
    guard let strongSelf = self else { return }
             
    do {
        try Auth.auth().signOut()
        
        // Remove UserDefaults
        let defaults = UserDefaults.standard
        defaults.removeObject(forKey: "email")
        defaults.removeObject(forKey: "name")
        defaults.synchronize()

        // Add some delay for the Firebase to perform logout function first before showing the VC
        
        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(5000)) {
            let vc = LoginViewController()
            let nav = UINavigationController(rootViewController: vc)
            nav.modalPresentationStyle = .fullScreen
            strongSelf.present(nav, animated: true) }
    
    } catch { print("Failed to log out")
    
    }}))
        present(actionSheet, animated: true)
    } }