Overview
Atlas App Services ofrece Muchos proveedores de autenticación permiten a los usuarios iniciar sesión en tu aplicación. Cada proveedor crea una identidad de usuario única. App Services y el SDK de Swift de Realm te permiten combinar varias credenciales en una sola identidad de usuario.
Ejemplo
Considere una aplicación que ofrece inicio de sesión anónimo. Esto permite a los usuarios explorar la aplicación sin registrarse. Si les gusta la aplicación, crean cuentas permanentes. Se registran con SSO o autenticación por correo electrónico y contraseña. De forma predeterminada, esto crea una nueva cuenta. User objeto. La aplicación debe vincular la nueva identidad con el usuario original.
Puedes vincular identidades usando linkUser(credentials:Credentials). Esto vincula proveedores de autenticación a un objeto de User con sesión iniciada.
@interface LinkIdentitiesExample : NSObject @end @implementation LinkIdentitiesExample { RLMApp *app; RLMUser *anonymousUser; } // Entry-point for example. - (void)runExample { app = [RLMApp appWithId:YOUR_APP_ID]; [self logInAnonymously]; } - (void)logInAnonymously { [app loginWithCredential:[RLMCredentials anonymousCredentials] completion:^(RLMUser *user, NSError *error) { if (error != nil) { NSLog(@"Failed to log in: %@", [error localizedDescription]); return; } // User uses app, then later registers an account [self registerNewAccountAsAnonymousUser: user]; }]; } - (void)registerNewAccountAsAnonymousUser:(RLMUser *)user { NSString *email = @"link2@example.com"; NSString *password = @"ganondorf"; [[app emailPasswordAuth] registerUserWithEmail:email password:password completion:^(NSError *error) { if (error != nil) { NSLog(@"Failed to register new account: %@", [error localizedDescription]); return; } // Successfully created account, now link it // with the existing anon user [self linkUser:self->anonymousUser withCredentials:[RLMCredentials credentialsWithEmail:email password:password]]; }]; } - (void)linkUser:(RLMUser *)user withCredentials:(RLMCredentials *)credentials { [[app currentUser] linkUserWithCredentials:credentials completion:^(RLMUser *user, NSError *error) { if (error != nil) { NSLog(@"Failed to link user: %@", [error localizedDescription]); return; } NSLog(@"Successfully linked user: %@", user); }]; } @end
let app = App(id: YOUR_APP_SERVICES_APP_ID) func logInAnonymously() { app.login(credentials: Credentials.anonymous) { (result) in switch result { case .failure(let error): print("Failed to log in: \(error.localizedDescription)") case .success(let user): // User uses app, then later registers an account registerNewAccount(anonymousUser: user) } } } func registerNewAccount(anonymousUser: User) { let email = "swift-link@example.com" let password = "ganondorf" app.emailPasswordAuth.registerUser(email: email, password: password) { (error) in guard error == nil else { print("Failed to register new account: \(error!.localizedDescription)") return } // Successfully created account, now link it // with the existing anon user link(user: anonymousUser, with: Credentials.emailPassword(email: email, password: password)) } } func link(user: User, with credentials: Credentials) { user.linkUser(credentials: credentials) { (result) in switch result { case .failure(let error): print("Failed to link user: \(error.localizedDescription)") case .success(let user): print("Successfully linked user: \(user)") } } } logInAnonymously()
Ejemplo de Async/Await
Nuevo en la versión 10.16.0.
El SDK Realm Swift proporciona una versión asíncrona/en espera de User.linkUser.
let app = App(id: YOUR_APP_SERVICES_APP_ID) func logInAnonymously() async throws -> User { let anonymousUser = try await app.login(credentials: Credentials.anonymous) // User uses app, then later registers an account let newAccountLinkedUser = try await registerNewAccount(anonymousUser: anonymousUser) return newAccountLinkedUser } func registerNewAccount(anonymousUser: User) async throws -> User { let email = "swift-async-link@example.com" let password = "ganondorf" try await app.emailPasswordAuth.registerUser(email: email, password: password) // Successfully created account, now link it // with the existing anon user let linkedUser = try await link(user: anonymousUser, with: Credentials.emailPassword(email: email, password: password)) return linkedUser } func link(user: User, with credentials: Credentials) async throws -> User { try await user.linkUser(credentials: credentials) } do { let linkedUser = try await logInAnonymously() print("Successfully linked user async: \(linkedUser)") } catch { print("Failed to link user: \(error.localizedDescription)") }
A partir de las versiones 10.15.0 y 10.16.0 del SDK de Realm Swift, muchas de las API de Realm admiten la sintaxis async/await de Swift. Los proyectos deben cumplir estos requisitos:
Versión del SDK de Swift | Requisito de versión Swift | Sistema operativo compatible |
|---|---|---|
10.25.0 | Swift 5.6 | iOS 13.x |
10.15.0 o 10.16.0 | Swift 5.5 | iOS 15.x |
Si su aplicación accede a Realm en un contexto async/await, marque el código con @MainActor para evitar fallas relacionadas con subprocesos.