tamadonのブログ

人間万事塞翁が馬

iOSアプリエンジニアがKotlin Multiplatform Mobileを使って感じたこと

はじめに

この記事は、 Kyash Advent Calendar 2022 の14日目の記事です。

adventar.org

KyashでiOSアプリを開発しているtamadonです。

Kyashのモバイルアプリ開発ではKotlin Multiplatform Mobile(以降KMM)を採用してUI以外のロジックを共通化しています。KotlinやAndroid Studioに触れてこなかったいちiOSエンジニアの感想を書いてみたいと思います。

KMM関連の記事については、チームメンバーの記事も公開されているので興味があればご覧ください。

KyashのKMMにおけるテストのこれまでとこれから

KotlinとAndroid Studioについて

KMMはKotlinで記述されており、Kotlinでコードを書くにはAndroid Studioを使うのが便利です。

どちらも業務でガッツリ使用するのは初めてだったので、最初は若干不安がありました。

実際は、Androidチームメンバーとペアプログラミングを行い不明点をその都度質問が出来たので、とてもスムーズに開発することが出来ました。

KMM開発の理解度の高いチームメンバーに感謝しかありません。

Xcodeと異なる操作感に戸惑うことも0ではないですが、Android Studio(というかJetBrains製IDE?)の完成度が高い点にうならされることが多いです。

特にコードのサジェスト機能(こう書いた方がKotlinっぽいよと推奨してくれる)が優秀だなと思いました。

ロジックの共通化について

上記画面の赤枠で囲った部分はKMMで表示条件を管理しています。

一部抜粋ですが実際のコードを紹介します。

KMMでこのようにStateの状態を定義し

// 各ステップにチェックを入れるか
val isApplicationCompleteChecked
    get() = when (applicationStatus) {
        REQUESTED, PREPARING, SHIPPING, ACTIVATION_REQUIRED, ACTIVATED -> true
        else -> { false }
    }

// "申し込み完了"と"郵送"の間にあるバーの進捗状況
val betweenApplicationAndShippingProgress: ApplicationProcessProgress
    get() = when (applicationStatus) {
        REQUESTED -> InProgress(0.5f)
        PREPARING, SHIPPING, ACTIVATION_REQUIRED, ACTIVATED -> Complete
        else -> { Todo }
    }

Swift UI Viewはstateの値を参照して表示を切り替えるのみという実装にしています

IssueStatusView(
    isChecked: state.isApplicationCompleteChecked,
    applicationProcessProgress: state.betweenApplicationAndShippingProgress
)

このコンポーネント表示条件判定処理に誤りがあり、修正が必要になったのですが、KMM側を修正するだけでiOSAndroidのコードは修正不要で、正しい挙動をするようになりました。

そのための仕組みなので当たり前ですが、強力なメリットを感じました。

課題に感じていること

ここまでは良いことを書いてきましたが、自分が課題に感じていることもいくつかあるので書いてみたいと思います。

リードタイムの増加

KyashではiOSAndroid・KMMを別リポジトリにて管理しています。またKMMの成果物をXCFrameworkとしてSwiftPMで配布しています。

つまり、KMMに修正があると以下の処理が必要になります。

KMMの修正 -> KMMの成果物を配布 -> 成果物をiOSアプリで取り込み

この成果物配布とiOSアプリへの取り込む時間が結構かかっており、何とかしたいとチームメンバーが問題提起してくれて、対策を考えている状態です。

Gradleチョットムズカシイ

KMMはGradleというビルドツールで管理されています。これがiOSアプリエンジニアである自分には馴染みがなく、何となく苦手意識を持っています。

社内でGradleの基本(普段実行しているgradlewコマンドのwはwrapperのwだよ、等)から理解する勉強会を実施していただいたことにより、苦手意識は結構減りましたがエラーが出るとドキドキしています。

こればっかりは経験を積むしかないですね。

おわりに

いかがでしたでしょうか。

まとめると「KMMは大変な点もあるけど、チームメンバーと一緒なら乗り越えられるしロジック共通化のメリットは大きくこれからも拡大していきたいです!」って感じです。

「KMM興味あるけど、実際のところどうなの?」と気になっている人の参考になれば幸いです。

Kyashでは仲間を募集しています。興味があれば是非ご応募ください。