マルチユーザー アプリケーション - Swift SDK
Realm Swift SDK を使用すると、複数のユーザーが特定のデバイスで同時にアプリにログインできます。 クライアント アプリケーションは、複数のユーザーが同時にログインしている場合でも、単一のアクティブ ユーザーのコンテキストで実行されます。 再度ログインする必要なく、認証されたユーザー間ですばやく切り替えることができます。
重要
ログインしたユーザーは、再認証を行わずに アクティブ ユーザー になる場合があります。 アプリによっては、セキュリティ上の脆弱性がある場合があります。 たとえば、共有デバイス上のユーザーは、認証情報を提供したり明示的な許可を必要とせずに、同僚のログイン アカウントに切り替えることができます。 アプリケーションでより厳格な認証が必要な場合は、ユーザー間の切り替えを避け、別のユーザーを認証する前にアクティブなユーザーを明示的にログアウトすることをおすすめします。
ユーザー アカウントの状態
ユーザーが特定のデバイスまたはブラウザで Atlas App Services を通じて初めてログインすると、Realm SDK はユーザーの情報を保存し、デバイス上のユーザーの状態を追跡します。 ログアウトした場合でも、ユーザーをアクティブに削除しない限り、ユーザーのデータはデバイス上に残ります。
次の状態では、ある時点でデバイス上のユーザーを記述します。
認証済み:デバイスにログイン済みで、ログアウトしたことがない、またはセッションが取り消されているユーザー。
アクティブ: 特定のデバイスで現在アプリを使用している単一の認証済みユーザー。 SDK はこのユーザーを送信リクエストに関連付け、App Services はデータアクセス権限を評価し、このユーザーのコンテキストで関数を実行します。 詳細については、アクティブ ユーザーを参照してください。
非アクティブ: 現在アクティブなユーザーではない、すべての認証済みユーザー。 現在非アクティブなユーザーにいつでもアクティブなユーザーを切り替えることができます。
ログアウト:デバイスで認証されたが、ログアウトされたユーザーまたはセッションが取り消されたユーザー。
以下の図は、特定のイベントが発生したときにクライアントアプリ内のユーザーが状態間でどのように移行するかを示しています。

デバイスへの新しいユーザーの追加
Realm SDK は、ユーザーがそのデバイスに初めてログインするときに、そのデバイスにユーザーを自動的に追加します。 ユーザーはログインすると、すぐにアプリケーションのアクティブ ユーザー になります。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let joeCredentials = Credentials.emailPassword(email: "joe@example.com", password: "passw0rd") app.login(credentials: joeCredentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let joe): // The active user is now Joe assert(joe == app.currentUser) } } let emmaCredentials = Credentials.emailPassword(email: "emma@example.com", password: "pa55word") app.login(credentials: emmaCredentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let emma): // The active user is now Joe assert(emma == app.currentUser) } }
デバイス上のすべてのユーザーを一覧表示
デバイスに保存されているすべてのユーザー アカウントのリストにアクセスできます。 このリストには、現在認証されているかどうかに関係なく、特定のデバイス上のアプリにログインしたすべてのユーザーが含まれます。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let users = app.allUsers users.forEach({ (key, user) in print("User: \(key) \(user)") })
アクティブなユーザーの変更
次のコードを使用して、アプリのアクティブ ユーザーを別のログイン ユーザーにいつでも変更できます。
let app = App(id: YOUR_APP_SERVICES_APP_ID) // ... log in ... // Get another user on the device, for example with `app.allUsers` let secondUser: User = getSomeOtherUser() XCTAssertNotEqual(app.currentUser, secondUser) // assert(app.currentUser != secondUser) // Switch to another user // app.switch(to: secondUser) // The switch-to user becomes the app.currentUser // XCTAssertEqual(app.currentUser, secondUser) // assert(app.currentUser == secondUser)
デバイスからユーザーを削除
デバイスからユーザーに関するすべての情報を削除し、ユーザーを自動的にログアウトできます。
app.currentUser?.logOut { (error) in // user is logged out or there was an error }