watabee's blog

プログラミング関連のブログです

Android と iOS のロジックを Kotlin Native で共通化する

最近 Kotlin Native が気になっていたので、Kotlin Native の勉強がてらにサンプルプロジェクトを作成してみました。

このサンプルプロジェクトでは以下のことを行なっています。

  1. 楽天のランキング API を使用して、ランキングデータを取得
  2. 取得したランキングデータを一覧表示
  3. 一覧をタップすると WebView で商品の詳細情報ページを表示
  4. 詳細情報ページを閲覧した商品をアプリ内のデータベースに最大10件まで保存し表示


Android iOS
f:id:watabee_dev:20181117222611p:plain:w260 f:id:watabee_dev:20181117222632p:plain:w260

AndroidiOS で View 周り以外では共通のロジックを使っています。

HTTP 通信

HTTP クライアントには ktor を使用してます。

ktor の HTTP クライアントに Engine を指定するのですが、Android では OkHttpiOSIos を使用しています。

JSON からデータモデルへの変換

JSON からデータモデルへの変換も ktor の JsonFeature を使用することで可能です。

内部的には kotlinx.serialization が使用されています。

SQLite

SQLiteSQLDelight の fork 版で使用できます。

sq ファイルに SQL を記述して特定の Gradle Task を実行することで、SQL を実行するコードやデータモデルが自動生成されます。

感想

HTTP 通信処理とデータベースなどの永続化処理をプラットフォーム共通で記述できるのであれば、シンプルなプロジェクトであれば割と使えるのではないでしょうか。

現状でも例えば Swagger Codegen で Kotlin のデータモデルのコードを自動生成して、それを AndroidiOS で共通で使用するといったくらいであれば可能かと思います。

iOS のメインスレッド以外での Kotlin Coroutine のサポート本家の SQLDelight でのマルチプラットフォームサポート が充実すれば、よりKotlin Native を使用してのプロジェクト実装が実現的になる気がします。

参考

実装するにあたって、以下のプロジェクトを参考にしました。