ユーザー ID のリンク - Swift SDK
Atlas Device SDK は非推奨です。 詳細については、 の廃止ページを参照してください。
Overview
Atlas App Services は、ユーザーをアプリにログインするためのの多くの認証プロバイダを提供します。 各プロバイダーは一意のユーザー ID を作成します。 App Services と Realm Swift SDK を使用すると、複数の認証情報を 1 つのユーザー ID にマージできます。
例
匿名ログインを提供するアプリケーションを検討してください。 これにより、ユーザーは登録せずにアプリを調べることができます。 ユーザーがアプリケーションを好み、永続的なアカウントを作成します。 SSO またはメール/パスワード認証でサインアップします。 デフォルトでは、これにより新しい User
オブジェクトが作成されます。 アプリは新しい ID を元のユーザーにリンクする必要があります。
linkUser(credentials:Credentials)
を使用して ID をリンクできます。 これにより、認証プロバイダがログインしたUser
オブジェクトにリンクされます。
@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()
Async/Await の例
バージョン 10.16.0 の新機能。
Realm Swift SDK はユーザー.linkUser の async/await バージョンを提供します。
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)") }
Realm Swift SDK バージョン 10.15.0 および 10.16.0 以降では、Realm API の多くが Swift async/await 構文をサポートしています。 プロジェクトは、次の要件を満たしている必要があります。
Swift SDK バージョン | Swift バージョン要件 | サポートされている OS |
---|---|---|
10.25.0 | Swift 5.6 | iOS 13.x |
10.15.0 または 10.16.0 | Swift 5.5 | iOS 15.x |
アプリがasync/await
コンテキストで Realm にアクセスする場合は、スレッド関連のクラッシュを回避するためにコードを@MainActor
でマークします。