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