Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

Realm Mobile Platformを触ってみた

f:id:timers-tech:20161006212023j:plain

お久しぶりです!iOSチームのかっくん(@fromkk)です。
9月末(28日〜30日)に皆で毎年恒例の「数字の上がらない開発合宿」に行ってきました!
名前の通り通常の業務から離れて、普段出来ない事・課題には感じているんだけどやれずにいた事を3日間で片付けようという趣旨の合宿です。

僕も事前にいくつか自分でタスクを考えていたんですが、合宿の前日にRealm Mobile Platformの発表がありこれはビッグウェーブが来る!!!と思ったので触ってみる事にしました。

Realm Mobile Platformとは

Realm Mobile Platformは簡単に言うとサーバー(macOS, Linux)にデータベースサーバー(Realm Object Server)を構築し、クライアント(iOS/Android)とリアルタイムに同期するという仕組みです。
ネットワークに関する処理は全く書く必要が無く、また、オフラインファーストで設計されているので圏外時の処理も考慮する必要が無いのが特徴です。
詳しくは公式サイトのブログに説明がありますのでそちらを見て下さい。

サーバーの構築

サーバーの構築も凄く簡単です!!公式サイトではmacOS,CentOS 6/7, Ubuntu,AWSでのインストール方法が紹介されています。
基本的にはリポジトリの登録、インストール、自動起動の設定、サービスのスタートという基本的な流れだけで出来る様になっています。
また、9080ポートをデフォルトで利用しているので、本番で利用する場合にはポートを開放する必要があるので注意が必要です。

macOS版にはサーバーのバイナリ、Realm Browser、サンプルアプリが同梱されているのでとりあえず触ってみるだけなら凄く障壁が低く感じます。

ちなみにDocker用の手順書もGistにアップしていますので興味のある方は御覧ください。

起動してみる

一旦macOSに同梱されているRealm Object Serverを起動してみたいと思います。
ダウンロードページからrealm-mobile-platform.zipをダウンロードして解凍します。
同梱されているstart-object-server.commandというファイルをダブルクリックして起動します。

Terminalが自動的に起動しサーバーが立ち上がり、 http://localhost:9080 がブラウザで起動します。

まず、管理者を登録する必要がありますので、管理者のメールアドレスとパスワードを登録します。
するとログインページが表示されますので先程登録した管理者のメールアドレスとパスワードを入力してログインします。
するとダッシュボードが表示されるかと思います。これで初期設定は完了です。

iOSアプリの初期設定

次にiOSアプリの作成です。Xcode 8、Swift 3、Carthageを利用する前提で進めたいと思います。Carthageは0.17.0以上が必要です。

公式サイトを参考に、Cartfileを作成し github "realm/realm-cocoa" を追記して、Terminalより carthage update を実行します。
XcodeLinked Frameworks and LibrariesCarthage/Build/iOS/Realm.frameworkCarthage/Build/iOS/RealmSwift.frameworkドラッグアンドドロップして登録します。
そして Build PhrasesRun Script を追加して、 Shellscriptの入力欄に /usr/local/bin/carthage copy-frameworks を入力、 Input Filesに

$(SRCROOT)/Carthage/Build/iOS/Realm.framework
$(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework

を入力します。

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

Realm Object Serverとクライアントで連携する為にはユーザーを作成しなければなりませんので最初にユーザーの作成方法を記載します。

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

ちなみにログインは .createAccount.useExistingAccount にするだけです。

登録・ログインが完了したらRealmオブジェクトを作成します。

let realmURL = URL(string: "realm://localhost:9080/~/database")!
let configuration = Realm.Configuration(syncConfiguration: (user, realmURL))
Realm.Configuration.defaultConfiguration = configuration
let realm = try! Realm()

//do something

Realmオブジェクトが作成出来れば後はいつも通りにアプリを開発していくだけです。

ユーザーについても、メアドパス以外にGoogle, iCloud, Facebookでのログインにも対応しているのが親切ですね。

注意点としては /~/database の様な形で作成するとユーザー毎にデータベースが作成されてしまいます。
1人で使うツールの様なアプリを作る場合はそれでもいいですが、複数人で利用する様なサービスを作りたい場合には困るのでパスを /database の様に指定します。
但し、それだと管理者ユーザーを利用する必要があるらしいです。
その為、ユーザーは作成せずに管理者ユーザーでトークンを利用してログインする方法を選択する必要があります。

まとめ

クライアント側はこれまでのRealmに加えてユーザーという概念を考慮するだけでサーバーとの自動同期が出来る という障壁の低さは感動的です!! また、サーバーというものをほとんど意識しないで良いというのも大きな魅力かと思います。
サーバーレスが流行していますが、これぞまさにサーバーレスというものを体現していると言えます。

とりあえず簡単なチャットアプリを作成してGithubに上げておきましたので興味のある人は見て頂ければと思います。


子育て家族アプリFammカップル専用アプリPairyを運営する Timers inc. では、現在エンジニアを積極採用中!急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP : http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる