我想让用户保持登录状态,不需要每次打开应用程序时都显示登录表单。我正在使用 MongoDB Realm 进行数据库和身份验证。 现在登录工作正常,但每次打开应用程序都需要登录。
这是我的登录代码
@objc func signUp() {
setLoading(true);
app.usernamePasswordProviderClient().registerEmail(username!, password: password!, completion: {[weak self](error) in
// Completion handlers are not necessarily called on the UI thread.
// This call to DispatchQueue.main.sync ensures that any changes to the UI,
// namely disabling the loading indicator and navigating to the next page,
// are handled on the UI thread:
DispatchQueue.main.sync {
self!.setLoading(false);
guard error == nil else {
print("Signup failed: \(error!)")
self!.errorLabel.text = "Signup failed: \(error!.localizedDescription)"
return
}
print("Signup successful!")
// Registering just registers. Now we need to sign in, but we can reuse the existing username and password.
self!.errorLabel.text = "Signup successful! Signing in..."
self!.signIn()
}
})
}
@objc func signIn() {
print("Log in as user: \(username!)");
setLoading(true);
app.login(withCredential: AppCredentials(username: username!, password: password!)) { [weak self](maybeUser, error) in
DispatchQueue.main.sync {
self!.setLoading(false);
guard error == nil else {
// Auth error: user already exists? Try logging in as that user.
print("Login failed: \(error!)");
self!.errorLabel.text = "Login failed: \(error!.localizedDescription)"
return
}
guard let user = maybeUser else {
fatalError("Invalid user object?")
}
print("Login succeeded!");
self?.navigationController?.pushViewController(hostingController, animated: true)
}
这是我的应用程序 rootView,我想在其中检查并保持用户登录状态
struct AppRootView: View {
var body: some View {
AnyView {
// check if user has already logged in here and then route them accordingly
if auth.token != nil {
homeMainView()
} else {
LoginController()
}
}
}
}
如何保持用户登录 MongoDB 领域?
据我了解*,一旦用户进行身份验证,他们将在该设备上保持经过身份验证的“登录”状态,直到他们手动注销,请记住,一旦注销,他们的访问令牌将在 30 分钟内保持活动状态。
指南中的两件事
会话的访问令牌将在三十分钟后过期。然而, 可以通过从以下位置检索新的访问令牌来启动新会话 使用刷新令牌的 MongoDB Realm。 (重要 ->)SDK 自动获取 关心刷新访问令牌,因此您无需担心 这是在实现客户端应用程序时进行的。
和
MongoDB Realm 处理访问令牌和刷新令牌 自动组成用户会话。
我们正在做的事情(看起来工作正常)是这样的:当应用程序打开时,我们调用一个 func handleSignIn 来检查应用程序是否有 .currentUser。如果是这样,那么我们配置 Realm。如果没有,则会显示登录/注册视图。这是一个片段
func handleSignIn() {
if let _ = gTaskApp.currentUser() {
print("user is logged in")
self.configRealmSync()
} else {
print("not logged in; present sign in/signup view")
gTaskApp 是我们应用程序的全局引用
let gTaskApp = RealmApp(id: Constants.REALM_APP_ID)
*这是一项正在进行的工作,请随时纠正我
希望这仍然有效,并且有人可以提供有关如何配置同步的更多信息,使 swift 领域实例能够持久保存用户会话。
对于我的应用程序,终止后,currentUser 始终为零。