【发布时间】:2017-07-18 05:46:57
【问题描述】:
我使用 UserDefaults 让用户保持登录状态,但有时用户会无缘无故地退出。当我调试这个案例时,我发现 UserDefault 为空!
注意:除非用户点击注销按钮,否则我不会清除这些值。
编辑:
这是一些代码:
当用户登录时,我使用以下方式保存令牌:
UserDefaults.standard.set("Bearer \(actualJson["access_token"].stringValue)", forKey: "access_token")
UserDefaults.standard.set("\(actualJson["refresh_token"].stringValue)", forKey: "refresh_token")
UserDefaults.standard.synchronize()
每次我从服务器收到 401 错误(令牌过期)时,我都会使用 refresh_token 获得新的错误:
AccountService.refreshToken(refreshToken: UserDefaults.standard.object(forKey: "refresh_token") != nil ? UserDefaults.standard.string(forKey: "refresh_token")! : "", callback: { (json) in
// set user defaults
UserDefaults.standard.set("Bearer \(json["access_token"].stringValue)", forKey: "access_token")
UserDefaults.standard.set("\(json["refresh_token"].stringValue)", forKey: "refresh_token")
UserDefaults.standard.synchronize()
})
在 AppDelegate 的 didFinishLaunchingWithOptions 方法中:
if UserDefaults.standard.object(forKey: "access_token") != nil && UserDefaults.standard.string(forKey: "refresh_token") != "" {
// go to home
}
在前面的代码中,UserDefaults.standard.string(forKey: "refresh_token") 为空。虽然我确定我没有清除值
【问题讨论】:
-
看不到代码什么都做不了。只需检查您是否在 appdelegate 或其他文件中添加了清除用户默认值的代码。
-
@DSDharma 我更新了问题
-
刷新令牌时可能是服务器的结果不好,比如
json["refresh_token"].stringValue为零。 -
在刷新令牌的会话过期情况下,您会得到什么 json。你验证了吗?
-
不要使用
UserDefaults.standard.synchronize()。它不仅自 iOS8 以来就毫无用处,甚至会产生问题(竞争条件、滞后等)。
标签: ios swift3 userdefaults