完成アプリ
KMPを用いてiOS/Androidの両OSでQittaの記事一覧を取得するアプリを作成しました。完成のデモになります。
iOS | Android |
---|---|
KMPとは
The Kotlin Multiplatform technology is designed to simplify the development of cross-platform projects. It reduces time spent writing and maintaining the same code for different platforms while retaining the flexibility and benefits of native programming.
公式ドキュメントの説明だと「Kotlin Multiplatformは、クロスプラットフォームプロジェクトの開発を簡素化するために設計されています。この技術は、異なるプラットフォーム向けに同じコードを書く時間とメンテナンスする時間を削減しながら、ネイティブプログラミングの柔軟性と利点を維持します。」と記載されています。
簡潔に言うとKotlinをベースにServerとAndroid,iOS,Desktop,Webでコードを共有して実装できる仕組みになります。これによりコードの再利用ができ開発効率の向上や保守の簡素化というメリットを享受できます。
本記事ではiOSとAndroidアプリのコードを共有化して実装を進めていきます
KMPでどこまでコードを共有するのか
KMPではUI、Presentation,BUsiness/Domain, Data/Core全てを共有してiOS/Androidアプリを開発することができます。しかしながらKMPでUIを共有化すると各プラットフォームのネイティブなUIコンポーネントや機能をフルに活用できず、実現したいレウアウトが実装できないと言う問題が発生します。
そのため本記事ではCreate a multiplatform app using Ktor and SQLDelightのチュートリアルに習ってUI部分とViewModelに関しては各プラットフォーム(iOS-SwiftUI, Android-Jetpack Compose)で実装しビジネスロジック部分をKMPで共通化して実装していきます。
本アプリの構造
図のような構造でアプリを開発しました。
各プラットフォームのViewを作成しそれぞれのViewModelを保持しています。KMPではQittaSDKとQittaAPIを持ちビジネスロジックとデータアクセスレイヤーを共通化しました。
実装
Githubで公開していますので参考にしてみてください。
kmm-qitta-list
KMPの環境設定に関してはこちらの公式ドキュメントを参考にすることができます。
Kotlin Multiplatformプロジェクト構成図
Kotlin Multiplatform Project
│
├── /composeApp
│ ├── commonMain
│ │ └── すべてのターゲットに共通するコード
│ ├── androidMain
│ └── Android専用のコード
│
├── /iosApp
│ └── iOSアプリケーションとしてビルドされるXcodeプロジェクト
│
└── /shared
├── commonMain
│ └── すべてのターゲットに共通するコード
├── androidMain
│ └── Android専用のコード
└── iosMain
└── iOS専用のコード
/composeApp
/composeAppフォルダは、Compose Multiplatformアプリケーション全体で共有されるコードを保存するためのフォルダです。主にUIコンポーネントや、Composeに関連するロジックが含まれます。本プロジェクトではAndroidのUIUIやViewModelに関する実装とAndroidManifest.xmlでAndroidのアプリ全体をしています。
/iosApp
/iosAppフォルダはiOSアプリケーションとしてビルドされるXcodeプロジェクトです。Xcodeで開きビルドすることができます。
/sharedフォルダ
/sharedフォルダは、プロジェクト内のすべてのターゲット間で共有されるコードを保存するためのフォルダです
参考文献
Ktor と SQLDelight を使用してマルチプラットフォーム アプリを作成する
Kotlin マルチプラットフォーム