6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RealmAdvent Calendar 2016

Day 3

複数ユーザーが共通のRealm Object Serverを参照する方法

Last updated at Posted at 2016-12-02

Realm Advent Calendar 2016 3日目のかっくんです。

9/27にRealm Mobile Platformが発表され、10/18に自社でFirebase.ebisu #1というイベントを開催したのですが、そこでFirebase Databaseの対抗馬としてRealm Mobile Platformを紹介しました。

その際に簡単なチャットアプリを作成し、そこで得たナレッジを共有出来ればと思います。


Realm Mobile Platform とは

公式サイトが詳しいので詳細はそちらにお任せしますが、簡単に言うとサーバーサイドにもRealmをインストールしてクライアントと完全同期してしまうプラットフォームです。
対応プラットフォームもCentOS 6/7, Ubuntu, macOS, AWSと幅広く対応していますしインストールも簡単です。

完全同期なので、何万人ものユーザーを抱える様なサービスを1つのデータベースで同期してしまうとファイル容量が一気に膨れ上がってしまいます。
その為、Realmではユーザー毎にデータベースを作成する事を推奨している様です。

ユーザーの作成・ログイン

// create user
let authURL = URL(string: "http://localhost:9080")!
let realmURL = URL(string: "realm://localhost:9080/~/realm")!
let credential = Credential.usernamePassword(username: "user@example.com", password: "hogehoge", actions: [.createAccount])
SyncUser.authenticate(with: credential, server: authURL) { (user, error) in
    if let user = user {
      let configuration: Realm.Configuration = Realm.Configuration(syncConfiguration: (user, realmURL))
      Realm.Configuration.defaultConfiguration = configuration
      //login success!
    } else if let error = error {
      print("user create failed \(error)")
    }
}

ログインは .createAccount.useExistingAccount に変更すればログイン出来ます。

但し、今回作ったチャットアプリの場合、複数のユーザーが1つのデータベースを参照する必要があったので、こちらの方法は利用しませんでした。
共通のデータベースを参照する場合、管理者アカウントが必要です。

let authURL = URL(string: "http://localhost:9080")!
let realmURL = URL(string: "realm://localhost:9080/realm")!
let credential: Credential = Credential.accessToken("ADMIN TOKEN HERE", identity: "ADMIN USER IDENTITY HERE")
SyncUser.authenticate(with: credential, server: authURL, timeout: 30.0) { [weak self] (user, error) in
  if let user = user {
    let configuration: Realm.Configuration = Realm.Configuration(syncConfiguration: (user, realmURL))
    Realm.Configuration.defaultConfiguration = configuration

    //login success!
  } else if let error = error {
      print("login failed \(error)")
  }
}

realmURL のパスが通常は /~/realm ですが、共通データベースは /realm になっているのがポイントです。
Linuxのパスと同様に /~ が該当ユーザーのフォルダである事を示します。

これでアプリ上の SyncUser は1人(管理者のみ)として扱う事が出来、アプリ側でユーザーの仕組みを作成すれば複数ユーザーで同じデータベースを参照する仕組みの完成です。

後は通常通りアプリを作成するだけです!


注意事項

冒頭にも述べた通りこの仕組を利用してしまうとユーザー数が膨大になった際、全てのデータが同期されてしまうので容量には注意が必要です。
例えばサーバー側で1GBのデータベースファイルになってしまった場合、各ユーザーも1GBのデータベースを保持する事になってしまう為です。
対処方法としては今回の場合、各チャットルーム毎に保持するメッセージ数の上限を設定して古いものから削除したり、チャットルームも一定期間やり取りの無いものは自動的に削除する等の仕組みを入れる事で解消出来るかもしれません。


まとめ

やはりRealmとしてはユーザー毎にデータベースを保持する方法を推奨している気がします。
そちらの方がセキュリティも高く、データベースの容量の心配もそんなに無い為です。
そう考えると個人で使う日記やTodoアプリ等のツール系アプリには非常に親和性が高い様に感じます。
一方で今回の様に複数ユーザーで同じデータベースを参照する方法も一応あるという事は知っておいても良いかもしれません。

まだ、Realm Mobile Platformを活用したアプリのリリースは聞いたことが無いですが、これから色んなアプリが出て来るのを楽しみにしています!

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?