ReactNative × FirestoreでiOSアプリを作成する手順とまとめ


■概要

CloudFirestoreとは

Firebaseが提供している、NoSQLベースのデータベースのうちの一つ(MBaasの一つ)

RealtimeDatabase → CloudFirestoreに進化!

Q、何が改善されてる?
A、データモデルの改善、クエリ強化されている。

Firebaseの機能とデータベース

■準備

  • Firebaseプロジェクトのセットアップ

    Firebase公式ページからコンソール画面に移動して、新規アプリ作成。

    プロジェクトIDとロケーションは後で変更が出来ないので、注意!

    ※国内向けサービスの場合、asia-northeast1(東京)or asia-northeast2(大阪)

  • バックエンド側のセットアップ

    • Firebase CLIをインストールする。これを使うと、Firebaseを使った開発がより効率的になる。
    npm install firebase-tools
    
    • デプロイを可能にするためにセットアップする。
    npm firebase login
    
  • Firestoreをセットアップ

    最初はテストモードで開始。

  • npmモジュールの追加

    npm install @react-native-firebase/app
    
  • iOSアプリ開発環境のセットアップ

    • CocoaPods経由でFirebaseをインストール。

    Finderで、「プロジェクト名」→「ios」→「podfile」を開く。podfile内にテキストで以下を記述する。

    target 'Project' do
      pod 'Firebase/Core'
      pod 'Firebase/Auth'
      pod 'Firebase/Firestore'
      pod 'Firebase/Functions'
    end
    

    iosアプリにFirebaseを作成するページで以下の流れに沿って進める。
    - pod install

    cd ios/ && pod install
    
  • Firebase SDKのセットアップ

    npm install @react-native-firebase/app
    npm install @react-native-firebase/auth
    npm install @react-native-firebase/firestore
    

■実装(データの操作)

  • CollectionとDocumentの取得、追加

    import firestore from '@react-native-firebase/firestore';
    
    // 'Users'というCollectionの、'KHarada'というDocumentを指定
    const userDocument = firestore()
      .collection('Users')
      .doc('kHarada');
        // 取得
        .get()
        // 追加
        .set()
    
  • AuthenticationアカウントとFirestoreドキュメントの作成

    新規登録画面で入力されたメールアドレス等をfirestoreドキュメントにぶちこむ。

    handleSubmit = async () => {
        try {
                // メールアドレス認証
          let res = await auth()
            .createUserWithEmailAndPassword(this.state.email, this.state.password)
            .catch((err) => {
              console.log(err);
            });
    
                    // ドキュメント内に保存するフィールド
            let userData = {
              uid: res.user.uid,
              email: this.state.email,
            };
    
                    // userDataを保存する
            await firestore()
              .collection('users')
              .doc(res.user.uid)
              .set(userData);
    
              console.log('email login success');
              this.props.navigation.navigate('App');
          }
    
        } catch (e) {
          console.log(e.message);
        }
      };
    
  • クエリの機能と種類

    クエリを使いこなすことで、firestore内に保存されているデータを制御し、自在に操作することが可能

    • 条件制限

      where

      Ex, 18歳以上のみ取得したいとき

      firestore()
        .collection('Users')
        // 18歳以上のみ
        .where('age', '>=', 18)
        .get()
      
    • 件数制限

      limit

      ドキュメントの数を制限したいとき

      firestore()
        .collection('Users')
        // 18歳以上のみ
        .where('age', '>=', 18)
        // ドキュメントを20こまで
        .limit(20)
        .get()
      
    • 並べ替え

      order By

      firestore()
        .collection('Users')
        // 降順で並べ替え
        .orderBy('age', 'desc')
        .get()
      
    • 特定のポイントから開始/終了

      start At / end At

      firestore()
        .collection('Users')
        .orderBy('age', 'desc')
          // 18歳から30歳まで
        .startAt(18)
        .endAt(30)
        .get()
      

      ↓実際に使う場面はこんなとき!

      startAtでリロード後の追加データをどのポイントから取得するのか指定する。

■Firestoreの課題

  • マイグレーション

    マイグレーション:ソフトウェアやシステム、データなどを別の環境に移転したり、新しい環境に切り替えたりすること。

    データのエクスポートが出来ない。バックアップする方法がない。

    (このデメリットはさほど気にならない気もする・・)

  • データベース設計

    データの形式が自由なだけあって、フィールドに書き込んだデータの型がわからなかったりする。

    チーム内でのドキュメント作成と共有が重要。

  • 検索

    ネイティブインデックスの作成やドキュメント内のテキストフィールドの検索をサポートしていないので、Algoliaという検索APIを使って、検索周りはそっちに任せる。

Firebaseでバックエンドエンジニア不在のアプリ開発 クックパッドが体感した、メリットと課題 #エンジニアHub - エンジニアHub|若手Webエンジニアのキャリアを考える!

全文検索 | Firebase

■Firestoreを今まで触ってみて思ったこと

  • プロジェクトの規模にもよるが、とにかく機能が充実していて、あまり不便さを感じていない。なので、RDBの必要性が見えてこない。
  • Authenticationは多くのSNSと連携することが可能なので、モダンなプロダクトにはもってこい
  • 多くの企業が利用しているせいか、日本語の記事が多い印象。初心者に優しい。

参考ページ

Cloud Firestore | React Native Firebase

実践Firestore (技術の泉シリーズ(NextPublishing))