ios - swift UserDefaults 中缺少登录凭据

标签 ios swift userdefaults

我有一个使用 rest api 进行身份验证的应用程序。我现在面临的问题是我也将用户的 token 保存在我的 UserDefaults 和用户名中,因为这是获取用户详细信息所需的两个主要参数。因此,如果应用程序被用户关闭,当他重新打开应用程序时,他仍然应该能够查看他的个人资料,但个人资料返回空的详细信息。这是我的 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 和详细信息会打印在控制台中,但用户配置文件会返回前一个人的个人资料。这是不应该的。我的代码如下所示

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

我还想补充一点,当我使用 postman 运行 api 时,我得到的响应是 "detail": "Signature has expired." 所以我不得不在 header 中输入新 token 所以它再次显示用户详细信息

最佳答案

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] = []) {
        let saveKeys = exclude.map({ $0.rawValue })
        for key in UserDefaults.standard.dictionaryRepresentation().keys {
            if !saveKeys.contains(key) {
                UserDefaults.standard.removeObject(forKey: key)
            }
        }
    }
}

我建议将 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() 已被弃用。

关于ios - swift UserDefaults 中缺少登录凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50590498/

相关文章:

ios - 如何在 iOS/Swift 中存储并保存更新的问题和答案集

ios - 存储 UITextView 字符串/文本数据

iphone - 不使用 uiimagepicker Controller 捕获图像和视频

ios - 使用 bitly 一次缩短多个网址

ios - 如何确定 NSUserDefaults 中存储的数据类型

swift - 在没有 nib 的情况下使用 NSTableView 创建 NSScrollView——缺少对 TableView 的约束

ios - Alamofire swift4 无效的 URL

Ios WKWebView拦截http/https请求

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

ios - UserDefaults - 使用 Xcode Simulator 时保存不一致