google Firebaseの “Authentication”、”Realtime Database”とは? 使い方とメリット (iphone版)

    こんにちは、昔cocos2dでiphoneゲームを作っていた中村です。

    最近またiphoneアプリを作っています。

    作成にあたりfirebaseの「Authentication」、「Realtime Database」を使ったので、これらの概要とメリットを紹介します。

    今回は以下を学習ポイントとしてiphoneアプリをストア公開までやってみました。
    ・cocosは使わずiosの標準機能をできるだけ利用する
    ・サーバーとの通信があり、サーバー側でデータを管理する

    上記からサーバー側の開発も必要でしたが、時間をかけずに作るためにBaasを使うことを選択しました。(結局外部サービスに頼りました)
    AWSなども選択肢にありましたが、Baasに特化しているという意味ではFirebaseの方が使い勝手が良さそう、という理由です。

    では、「Authentication」、「Realtime Database」使って学んだことと感じたメリットを紹介します。

    ■Authentication (認証機能)

    AuthenticationとはfirebaseでメールアドレスやSNSのログイン、アカウント管理を提供します。
    ・コンソール画面
    スクリーンショット 2017-10-31 7.36.36

    ・Authenticationでできること

    ユーザー管理に関する機能になりますが、一般的に使われるであろう機能は用意されています。
    ・匿名登録
    ・メールアドレス登録
    ・SNS登録
    ・パスワード変更
    ・ログイン・ログアウト

    環境設定が終わっていれば実装する際は、
    Auth.auth().signInAnonymously()
    の1行でアカウントの登録処理ができます。簡単!

    詳細は以下を参考にしてください。
    ・Firebase Authentication
    https://firebase.google.com/docs/auth/

    ・Authenticationで便利だと感じたこと

    1.匿名登録→メールアドレス登録に変更が簡単

    今回アプリを作るにあたり、サーバーでデータ管理をするようにしました。
    その場合ユーザーのアカウント管理が必要になります。ただし、メールアドレスを必須入力、などだと敷居が上がるため、匿名登録ができる機能を求めていました。Firebaseに”匿名登録”機能が用意されていました。
    実装は1行SDKのメソッドを実行するだけです。
    (上記キャプチャの”匿名”となっているアカウント)

    さらに凄いのが、この匿名ユーザーを簡単にメールアドレスのアカウントに変更できます。Auth.auth().currentUser?.link(with: credential(メールアドレスとパスワードの入力情報)) { (user, error) in {[ローディング処理など]}
    これもたった1行でその処理を実現できます。

    2.他のfirebaseサービスと連携して認証処理などが簡単

    Authenticationはfirebaseを使うにあたりコアな機能になります。
    Notifications(push通知)やFunctions(APIサービス)などもAuthenticationと連携することでユーザー管理・認証を実現できます。

    例えばRealtime Databaseであれば、以下ルール設定しておくと、ユーザー認証の場合のみ使用可能になります。{"rules":{".read":"true" ,".write":"true"}}
    →認証ができている場合のみに使用できる設定
    この認証処理を実現するためには、Authentication処理をすると、自動でアプリ内にfirebaseのアカウント情報が保存され使用できます(保存されている場所がよく分かっていませんが。。)。
    ・例えばログインの処理の場合Auth.auth().currentUser?.link(with: credential(メールアドレスとパスワードの入力情報)) { (user, error) in {[ローディング処理など]}
    →この時に自動でにログイン情報が保存
    ユーザーの細かな属性や設定はカスタマイズが必要ですが、簡易的に会員管理をするにはうってつけです!

    ■RealTime Database (データベース機能)

    Realtime DatabaseとはNoSQL形式で、データベースを提供します。
    オフラインでも利用でき、端末間同期もできるとっても便利な機能です。
    ・コンソール画面
    スクリーンショット 2017-10-31 8.33.16

    ・Realtime Databaseでできること

    名前の通りリアルタイムでデータの通信ができます。
    かつ複数端末で利用できます。
    上述した通り、NoSQL形式のため、開発する際は事前にデータを定義しておき、それに応じたデータ投入、編集、取得処理を行う必要があります。
    例えば、登録処理をするときは、
    Database.database().reference().updateChildValues(“配列データ”)
    だけでデータ登録が可能です。

    ・realtime databaseで便利だと感じたこと

    1.高速かつ簡単な登録・編集・削除処理

    上述した通り、データを簡単に登録削除・編集が可能です。
    NoSQL形式ということもあり当然スピードは高速です。
    かつ指定の方法も
    Database.database().reference().child(”node名”).child(”node名”).child(”node名”)….
    とchildの中にノード名を指定するだけで、どの値かを選べます。
    (ただしNoSQLで階層が深いのは推奨されていません)

    更に別のサービスですがストレージの管理storageサービスとの連動も簡単です。
    画像の投稿なども数行で実現できます。
    詳細は以下を参考にしてください。
    ・Firebase Realtime Database
    https://firebase.google.com/docs/database/

    2.FirebaseUIを使うと簡単にリスト形式のリアルタイム同期機能が可能

    機能のメインがリアルタイムな同期機能になりますが、firebaseがgithub上で、
    さらに便利に活用できるFirebaseUIというソースを公開しています。
    ・FirebaseUI
    https://github.com/firebase/FirebaseUI-iOS

    今回使ったのは、この中の”FUITableViewDataSource”というクラスです。

    iosで非常に面倒なTableViewを使った同期処理の実装が簡易にできます。
    細かい説明は省きますが、このDataSourceに指定したいqueryを設定しておき、tableviewのcellに指定します。FUITableViewDataSource = FUITableViewDataSource(query: self.query!) { (tableView, indexPath, snap) -> UITableViewCell in
    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! CustomTableViewCell
    〜データの加工}}

    数行を書くだけで、端末間のデータ同期・リアルタイム同期がいい感じに実装できます。
    (iosのtableviewは非常に面倒なのでもっと簡単にできるツールが欲しいとこです)

    そんな凄いRealtime Databaseですが、不便なこともあります。

    ・不便だと感じたこと

    複雑な条件処理には不向きです。
    RDBMS(MySQLなど)に慣れていると、構造化したくなりますが、その感覚で設計するとうまく使えません。
    (感覚が全然違います)

    例えば、2つの条件での絞り込みすら面倒でした。
    まず、Realtime Databaseでは1つの条件でしか絞り込みができません。。
    そのため、2つ以上の条件で絞り込みする際は、データをそのように構造化する必要があります。
    ここも細かい説明は省きますが、以下のような設定が必要です。
    データ構造)
    ・条件1のデータ群1
    ・条件1のデータ群2
    ・条件1のデータ群3
    このデータ構造に対して絞り込みたいデータ群を指定、そのデータ群に対して条件2で条件を指定します。
    ex)条件1のデータ群3に対して条件2で絞り込み

    やりたいことによっては制約が多いので、使うポイント見極めることが重要そうです。

    まとめ

    まとめ
    ・メリット
    Baasのため、サーバー開発が不要です。
    また、firebaseなどサービスによってはかなりリッチな機能(リアルタイム同期)などが備わっているため、使い方次第では非常にパワーがあります。
    ・デメリット
    これもBaasのためですが、仕様の制約によってできないことがあります。
    サービスの規模や内容によってはあまりFitしない可能性があります。

    と、当たり前のまとめになりましたが、公開したアプリは恥ずかしいので見たい人は個人的に問い合わせください。

    今回紹介していないですが、CloudFunctionsはかなり便利そうなので、次はこれで違うアプリを作ってみたいです。

    ではまた。