swift UserDefaults 中缺少登录凭据
Login credentials missing in swift UserDefaults
我有一个使用 rest api 进行身份验证的应用程序。我现在面临的问题是我也将用户的令牌保存在我的 UserDefaults 和用户名中,因为这是获取用户详细信息所需的两个主要参数。因此,如果应用程序被用户关闭,他应该仍然能够在他打开应用程序时查看他的个人资料,而不是个人资料 returns 空详细信息。这是我的 UserDefaults 代码
let defaults = UserDefaults.standard
var isLoggedIn : Bool {
get {
return defaults.bool(forKey: LOGGED_IN_KEY)
}
set {
defaults.set(newValue, forKey: LOGGED_IN_KEY)
}
}
//Auth Token
var authToken: String {
get {
return defaults.value(forKey: TOKEN_KEY) as? String ?? ""
}
set {
defaults.set(newValue, forKey: TOKEN_KEY)
}
}
var userUsername: String {
get {
return defaults.value(forKey: USERNAME_KEY) as? String ?? ""
}
set {
defaults.set(newValue, forKey: USERNAME_KEY)
}
}
我不知道为什么它不检索用户数据。
我的第二个问题是,当我注销用户时,所有用户的详细信息都会按预期清除,但是当我尝试使用其他用户登录时,新用户的 authToken 和详细信息会打印在控制台中,但用户个人资料returns 前一个人的个人资料。这是不应该的。我的代码如下所示
func logoutUser() -> Void {
pk = 0
username = ""
email = ""
firstName = ""
lastName = ""
AuthService.instance.isLoggedIn = false
AuthService.instance.authToken = ""
AuthService.instance.userUsername = ""
}
@IBAction func logoutPressed(_ sender: Any) {
UserDataService.instance.logoutUser()
dismiss(animated: true, completion: nil)
}
我还想补充一点,当我 运行 api 使用邮递员时,我收到 "detail": "Signature has expired."
的回复,所以我不得不在 [=24] 中输入新令牌=] 所以它再次显示用户详细信息
enum SettingKeys: String {
case authToken
//...
}
struct Settings {
static var authToken: String? {
get { return UserDefaults.standard.string(forKey: SettingKeys.authToken.rawValue) }
set(value) { UserDefaults.standard.set(value, forKey: SettingKeys.authToken.rawValue) }
}
static func deleteAll(exclude: [SettingKeys] = []) {
var saveKeys = exclude.map({ [=10=].rawValue })
for key in UserDefaults.standard.dictionaryRepresentation().keys {
if !saveKeys.contains(key) {
UserDefaults.standard.removeObject(forKey: key)
}
}
}
}
我建议将密钥存储为枚举,因为这样你就可以像这样使用它:
//Read
if let token = Settings.authToken {
//do something
}
//Write
Settings.authToken = "123456"
//Delete settings
Settings.deleteAll()
//or choose what to leave
Settings.deleteAll(exclude: [.authToken])
值得一提的是 defaults.synchronize()
已弃用。
我有一个使用 rest api 进行身份验证的应用程序。我现在面临的问题是我也将用户的令牌保存在我的 UserDefaults 和用户名中,因为这是获取用户详细信息所需的两个主要参数。因此,如果应用程序被用户关闭,他应该仍然能够在他打开应用程序时查看他的个人资料,而不是个人资料 returns 空详细信息。这是我的 UserDefaults 代码
let defaults = UserDefaults.standard
var isLoggedIn : Bool {
get {
return defaults.bool(forKey: LOGGED_IN_KEY)
}
set {
defaults.set(newValue, forKey: LOGGED_IN_KEY)
}
}
//Auth Token
var authToken: String {
get {
return defaults.value(forKey: TOKEN_KEY) as? String ?? ""
}
set {
defaults.set(newValue, forKey: TOKEN_KEY)
}
}
var userUsername: String {
get {
return defaults.value(forKey: USERNAME_KEY) as? String ?? ""
}
set {
defaults.set(newValue, forKey: USERNAME_KEY)
}
}
我不知道为什么它不检索用户数据。
我的第二个问题是,当我注销用户时,所有用户的详细信息都会按预期清除,但是当我尝试使用其他用户登录时,新用户的 authToken 和详细信息会打印在控制台中,但用户个人资料returns 前一个人的个人资料。这是不应该的。我的代码如下所示
func logoutUser() -> Void {
pk = 0
username = ""
email = ""
firstName = ""
lastName = ""
AuthService.instance.isLoggedIn = false
AuthService.instance.authToken = ""
AuthService.instance.userUsername = ""
}
@IBAction func logoutPressed(_ sender: Any) {
UserDataService.instance.logoutUser()
dismiss(animated: true, completion: nil)
}
我还想补充一点,当我 运行 api 使用邮递员时,我收到 "detail": "Signature has expired."
的回复,所以我不得不在 [=24] 中输入新令牌=] 所以它再次显示用户详细信息
enum SettingKeys: String {
case authToken
//...
}
struct Settings {
static var authToken: String? {
get { return UserDefaults.standard.string(forKey: SettingKeys.authToken.rawValue) }
set(value) { UserDefaults.standard.set(value, forKey: SettingKeys.authToken.rawValue) }
}
static func deleteAll(exclude: [SettingKeys] = []) {
var saveKeys = exclude.map({ [=10=].rawValue })
for key in UserDefaults.standard.dictionaryRepresentation().keys {
if !saveKeys.contains(key) {
UserDefaults.standard.removeObject(forKey: key)
}
}
}
}
我建议将密钥存储为枚举,因为这样你就可以像这样使用它:
//Read
if let token = Settings.authToken {
//do something
}
//Write
Settings.authToken = "123456"
//Delete settings
Settings.deleteAll()
//or choose what to leave
Settings.deleteAll(exclude: [.authToken])
值得一提的是 defaults.synchronize()
已弃用。