Kotlin Multiplatform Mobile (KMM)でFirestoreを利用する方法を紹介します。
利用するライブラリ
非公式ですが firebase-kotlin-sdk
というライブラリを利用します。
github.com
他に FirestoreKMP というライブラリも見つかりましたが、こちらはアーカイブ済みだったのでfirebase-kotlin-sdk
を利用するようにします。
依存関係の追加
- 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
- プロジェクトの設定「マイアプリ」からiOSアプリの追加をします。
- 必要なアプリの情報を入力します。(Bundle IDやアプリ名)
Google-Service-info.plist
をDLします。- Xcodeでプロジェクトを開いて
Google-Service-info.plist
を追加します。 - プロジェクトのiosApp/Podfileに次の記述を追加します。
target 'iosApp' do use_frameworks! // ... pod 'Firebase/Core' # これを追加 pod 'Firebase/Firestore' # これを追加 end
- iosApp配下で
pod install
を実行します - iosApp/iosApp/iOSApp.swiftに次の記述を追加します。
import Firebase @main struct iOSApp: App { init() { FirebaseApp.configure() // これを追加 } }
Android
- プロジェクトの設定「マイアプリ」からiOSアプリの追加をします。
- 必要なアプリの情報を入力します。(パッケージ名やアプリ名)
google-services.json
をDLします。- プロジェクトのandroidApp配下に
google-services.json
を追加します。 - 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) }
- 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)を利用している人のお役に立てれば幸いです。
参考