kako.dev

開発、自作アプリのこと

Firestore with Kotlin Multiplatform Mobile (KMM)

Kotlin Multiplatform Mobile (KMM)でFirestoreを利用する方法を紹介します。

利用するライブラリ

非公式ですが firebase-kotlin-sdk というライブラリを利用します。 github.com

他に FirestoreKMP というライブラリも見つかりましたが、こちらはアーカイブ済みだったのでfirebase-kotlin-sdkを利用するようにします。

依存関係の追加

  1. shared(共通モジュールなど)のbuild.gradle.ktsに次の記述を追加します。
sourceSets {
        val commonMain by getting {
            dependencies {
            // ...
            implementation("dev.gitlive:firebase-firestore:1.8.1")
            implementation("dev.icerock.moko:mvvm-core:0.16.1")
}

Firestoreにデータを作る

Firebaseでプロジェクトを作成します。 Firestoreでアプリで利用したいデータベースを作成してデータを入れておきます。

たとえば、Usersデータベースとドキュメントを作成しておきます。

User1: { name: "kako351"}

アプリの設定をする

iOS, Android 両方アプリの設定をする必要があります。

iOS

  1. プロジェクトの設定「マイアプリ」からiOSアプリの追加をします。
  2. 必要なアプリの情報を入力します。(Bundle IDやアプリ名)
  3. Google-Service-info.plistをDLします。
  4. Xcodeでプロジェクトを開いてGoogle-Service-info.plistを追加します。
  5. プロジェクトのiosApp/Podfileに次の記述を追加します。
target 'iosApp' do
  use_frameworks!
  // ...
  pod 'Firebase/Core' # これを追加
  pod 'Firebase/Firestore' # これを追加
end
  1. iosApp配下でpod installを実行します
  2. iosApp/iosApp/iOSApp.swiftに次の記述を追加します。
import Firebase

@main
struct iOSApp: App {
    init() {
        FirebaseApp.configure()  // これを追加
    }
}

Android

  1. プロジェクトの設定「マイアプリ」からiOSアプリの追加をします。
  2. 必要なアプリの情報を入力します。(パッケージ名やアプリ名)
  3. google-services.jsonをDLします。
  4. プロジェクトのandroidApp配下にgoogle-services.jsonを追加します。
  5. shared(共通モジュールなど)のbuild.gradle.ktsに次の記述を追加します。
val androidMain by getting {
            dependencies {
            // ...
            implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
}

6.プロジェクト直下のbuild.gradle.ktsに次の記述を追加します。

plugins {
    id("com.google.gms.google-services").version("4.3.15").apply(false)
}
  1. androidApp/build.gradle.ktsに次の記述を追加します。
plugins {
    id("com.google.gms.google-services").version("4.3.15").apply(false)
}

apply(plugin = "com.google.gms.google-services")

Version Catalogなどを利用している場合は適宜読み替えてください

FirestoreDBの読み取りを実装

前述で作成したデータ(例. Users)の読み取りをします。 ここではリポジトリパターンを利用して実装しています。

class FirebaseRepository {
    private val db
        get() = Firebase.firestore

    suspend fun getUsers(): List<DocumentSnapshot> {
        return db
            .collection("Users")
            .get()
            .documents
    }
}

ViewModelで取得

実装したリポジトリをViewModelなどで呼び出します。 DIなどを使用している場合は適宜読み替えてください。

class FirebaseViewModel(
    val repository: FirebaseRepository = FirebaseRepository()
): ViewModel() {

    fun getUsers() {
        viewModelScope.launch {
            val users = repository.getUsers()
            // ...
        }
    }
}

これで完了です。 iosApp, androidApp 両方とも起動してFirestoreからデータを取得できていることを確認できればOKです。

最後に

私自身がAndroidの経験はあるのでAndroidは得に問題なく理解できたのですが、iOSには明るくないため、設定周りの見直しを何度もしました。

KMMでFirestore(Firebase)を利用している人のお役に立てれば幸いです。

参考