【Swift】Firebase導入方法 〜 Realtime Database & Cloud Firestore の使用方法

<!-- 
参考にしたサイト
https://qiita.com/eKushida/items/54b62d3961a5c74a71af
-->

#前書き
Firebaseを使用したアプリを作成したので、今後Firebaseを使用したプロジェクトの導入をスムーズにするために導入方法をメモしました。
`Realtime Database` と `Cloud Firestore`のデータベース作成方法と使用方法についても後半で説明しています。

#① プロジェクトの作成手順
####1. Firebaseコンソールにアクセスして**プロジェクトを作成**を押下  
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/c3bc3299-812c-61d6-50b5-09ecee5eb1f8.png)


####2. プロジェクトの作成
　`プロジェクト名`に任意のプロジェクト名を入力
　**続行**ボタンを押下
![スクリーンショット 2020-10-04 17.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/ba1eb2d8-6e3d-af79-0d6a-324b7344bebd.png)



####3. アナリティクスの構成
　デフォルトのまま**続行**ボタンを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/276c2e1f-cb16-2481-aea4-ba81cdfa4083.png)

　`アナリティクスの地域`を日本に設定
　`データ共有の設定と Googleアナリティクスの利用規約`に全チェック
　**プロジェクトを作成**ボタンを押下
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/46c86f27-cc85-315d-28e3-d8aa16e2b4dd.png)

####4. 作成完了
　**続行**ボタンを押下
![スクリーンショット 2020-10-04 17.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/7ef0ae09-2c22-52ab-c3ff-dad03b38f8b2.png)




#② アプリの追加
####1. iOSアプリにFirebaseを使用するための設定ファイルを導入する
　プロジェクトのコンソールから**iOS**を選択
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/4a2a98e1-53a9-4833-2721-3dc082639546.png)


####2. iOSアプリにFirebaseを追加する
　1. `iOS`バンドルIDにFirebaseを追加するiOSアプリのバンドルIDを記入
　　`アプリのニックネーム` `App Store ID`は省略可能です
　　入力し終えたら**アプリを登録**ボタンを押下
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/94f032c8-f8e0-aab6-35e8-ed38ff52ebe2.png)


　2. **GoogleService-info.plistをダウンロードして**プロジェクトのルートフォルダにコピーします。
　　コピーしたら**次へ**ボタンを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/9b6fa4fd-123c-07f2-bb95-9308cf18f370.png)


　3. 表示されている手順通りにFirebase SDKをCocoaPods経由でインストールします。
　　導入が完了したら**次へ**ボタンを押下
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/c9034716-14fb-4d5b-f94c-22e05a47c46b.png)


　4. `Swift`を選択。
　　　iOSアプリ側で`AppDelegate.swift`を開き。下記の２箇所を追記する。
　　　記入したら**次へ**ボタンを押下。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/d953c85f-8cbf-2137-f511-0fac58bf4fd6.png)


　5. アプリ起動して疎通確認してみましょう。

・疎通確認中
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/21f36e9c-7d5d-9a44-07c8-66ca67a5f10e.png)

・疎通成功
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/7f283ecc-abc5-2b42-3d69-2acfd6fe68e3.png)


#③ Realtime Databaseでデータベースを作成
　1. 作成したプロジェクトを開く
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/1ac26724-a9e2-e3db-6287-a0bc967c5938.png)

　2. `Realtime Database`を選択して、`データベースを作成`ボタンを押下
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/251b0e46-d694-74a2-5126-3ec557015ecb.png)


　3. `ロックモードで開始`を選択して、**有効にする**ボタンを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/b6098259-cd51-9ab2-68f7-7d1c9e0429ea.png)

　4. **ルール**から`read` `write` を`true`にして、**公開**ボタンを押下
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/ce9dfd01-6df7-774d-6a0d-bc7f25540c2d.png)

　5. Realtime Databaseを使用するためのSDKをCocoaPod経由でインストールする

```
pod 'Firebase/Database'
```

　6. ViewController.Swiftに下記のコードをコピペしてアプリを実行する

```
import UIKit
import FirebaseDatabase

class ViewController: UIViewController {
    
    var databaseRef: DatabaseReference!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Firebaseの共有インスタンスを取得
        databaseRef = Database.database().reference()
        
        // データ保存処理後のコールバック関数
        let resultCallback = { (error: Error?, ref: DatabaseReference) -> () in
            print(#function)
        }
        
        // データ保存
        self.databaseRef.child("Root").childByAutoId().setValue("TestValue", withCompletionBlock: resultCallback)
    }
}
```

　7. Realtime Databaseのコンソールを確認すると、データが保存されていることが確認できます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/c3e67dee-49c7-23f7-b55b-e438eac3cd37.png)



#④ Cloud Firestoreでデータベースを作成
　1. 作成したプロジェクトを開く
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/b0cf8813-3d5c-d6aa-2c82-0bb308ba3d7f.png)


　2. `Cloud Firestore`を選択して、`データベースの作成`ボタンを押下
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/ad511c3f-7d26-e95b-62cd-14263a01ff80.png)



　3. `本番環境モードで開始する`を選択して、**次へ**ボタンを押下
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/4496dc19-23ad-2617-f9eb-b2bb6431f7de.png)


　4. **Cloud Firestore**から`nam5（us-central）` を選択して、**有効にする**ボタンを押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/a10bb14b-22b8-3572-4c81-6506547be609.png)

　5. **ルール**から`read` `write` を`true`にして、**公開**ボタンを押下
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/50163d99-fc19-392b-ad8e-683a4e1c1154.png)

　6. Cloud Firestoreを使用するためのSDKをCocoaPod経由でインストールする

```
pod 'Firebase/Firestore'
```

　7. データから**コレクションを開始**を選択
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/79a2d07f-1afc-f66e-53e6-4a711a6ab403.png)

　8. コレクションIDに`users`と入力して**次へ**ボタンを押下
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/b4f456d6-6b3a-d9c2-5226-cfc6b49df228.png)

　9. 下記の内容を入力して**保存**ボタンを押下
　ドキュメントID: `user_data`
　フィールド: `name` 
　タイプ: `string`
　値: `テストユーザー`
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/31e4b6fb-5235-26ce-6929-0c38c2f7f519.png)

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676215/171b62ed-9ce7-ed41-aa79-9c723e8b2dcc.png)

　10. ViewController.swift に下記のコードをコピペして実行すると、コンソールにユーザー名が出力されます

```
import UIKit
import FirebaseFirestore

class ViewController: UIViewController {
    
    // Firestoreの共有インスタンス
    var databaseStore: Firestore!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Firestore共有インスタンス
        self.databaseStore = Firestore.firestore()
        
        // usersコレクションからデータを取得
        databaseStore.collection("users").document("user_data").getDocument{ (document, error) in
            
            if let document = document {
                if let data = document.data() {
                    // ユーザー名を取得
                    let name: String = (data["name"] as? String)!
                    
                    print(name)
                }
            } else {
                print("error")
            }
        }
    }
}
```