iOSDC2022に公開されたセッション「Kotlin Multiplatform Mobile でiOSとAndroidの実装差異を無くす」のプレゼンテーションです。
チームラボでは、スマホアプリ開発者を募集しています。 少しでも、チームラボにご興味をお持ち頂けましたら、採用ページをご覧頂けますと幸いです。 https://www.team-lab.com/recruit/
Kotlin Multiplatform Mobile でiOSとAndroidの実装差異を無くす新田 陸
View Slide
自己紹介チームラボ株式会社新田 陸iOSエンジニア 5年目
チームラボについてチームラボプラネッツ チームラボボーダレス
チームラボについて
Kotlin Multiplatform Mobile (KMM)「ネイティブのUXを保ったまま、ロジックをiOSとAndroidで共有する」
我々のチームではチームラボでは2年前からKMMを使用していますなぜ我々がKMMを採用するに至ったか1. ロジック部分の品質を求められるプロジェクトだった2. OS間での実装差異が問題となっている
OS間での実装差異の解消原因としては- 実装するエンジニアの認識のズレ- 言語仕様の違い例えどれだけ念入りにやったとしても、この問題はいつか必ず発生する
OS間での実装差異の解消KMMはiOSとAndroidで、同じコードを使うことでOS間の実装差異を無くすKotlin Multiplatform Mobile→ iOSでKotlinのコードを動作させる
目次1. KMMを使うことのメリットと役割分担2. iOSエンジニアがKMMにもつ疑問3. 実際にやってみたチーム開発での課題
1. KMMを使うことのメリットと役割分担
メリットコードを共通化することでOS間での動作の差異を減らす
すべてのコードをKMMで共通化すべきかUIBluetooth ビジネスロジックAPIの差異が大きい❌共通化が難しいOSのAPIの差異で考えるAPIの差異が小さい⭕共通化しやすい
すべてのコードをKMMで共通化すべきかKMM公式の使用例KMM+SwiftUI
KMMとネイティブでの役割分担KMM担当View ViewModelネイティブ担当
我々のチームではここまでの層を任せることにしたKMM担当ネイティブ担当iOSメンバー AndroidメンバーKMMメンバーView ViewModel
2. iOSエンジニアがKMMにもつ疑問
Q. KotlinのコードはどのようにSwift上で動作するのか?Q. KMMをiOSプロジェクトに組み込む方法は?Q. リポジトリの管理方法については?Q. 我々が普段やっているところをKMMでやるならどうするのか?
Q. KotlinのコードはどのようにSwift上で動作するのか?
Q. KotlinのコードはどのようにSwift上で動作するのか?A. Objective-Cのフレームワークに変換して利用するKotlinのコードObjective-CFrameworkKMM
Q. KMMをiOSプロジェクトに組み込む方法は?
Q. KMMをiOSプロジェクトに組み込む方法は?A. Objective-Cのフレームワークに変換して利用する
Q. リポジトリの管理方法については?
Q. リポジトリの管理方法については公式のサンプルでは全てのコードを一つのリポジトリで管理共同リポジトリ.swift全てのコードを一つのリポジトリに.ktandroid.ktKMM
Q. リポジトリの管理方法についてはフレームワークさえあればよいObjective-CFramework
FrameworkリポジトリKMMリポジトリ.ktリポジトリを3つに分割するiOSリポジトリ.swift更新のたびに再生成CocoaPodsSwiftPMなどで取得
KMM更新しました!Pullしてビルドします!1. KMMのビルド環境を揃える2. KMMのリポジトリをPullする3. KMMをビルドする
CI/CDサービスの利用
FrameworkリポジトリKMMリポジトリ.ktCI/CDによるフレームワークの自動ビルドiOSリポジトリ.swiftCI/CD
Q. iOSで普段やっているところをKMMでやるならどうするのか?
Q. iOSで普段やっているところをKMMでやるならどうするのか?URL Session Core Data KeyChainデータ永続化API通信 キーチェーン
Q. iOSで普段やっているところをKMMでやるならどうするのか?iOS/SwiftURL SessionCore DataKeyChain
Q. iOSで普段やっているところをKMMでやるならどうするのか?iOS/SwiftURL SessionCore DataKeyChainKMM/KotlinKtorSQLDelightKissme
Q. iOSで普段やっているところをKMMでやるならどうするのか?iOS/SwiftCore ML機械学習LocalAuthentication生体認証KMM/Kotlin
Q. iOSで普段やっているところをKMMでやるならどうするのか?iOS/SwiftCore ML機械学習KMM/KotlinLocalAuthentication生体認証存在しない?
ネイティブのコードをKMMから呼び出す方法
iOS独自のコードをKMMから呼び出す方法KMMiOSAndroid
iOS独自のコードをKMMから呼び出す方法KMMiOSAndroidMLKitBiometricCore MLLocalAuthentication
iOS独自のコードをKMMから呼び出す方法KMMiOSAndroidMLKitBiometricCore MLLocalAuthenticationiOSAndroid共通のインターフェース
3. 実際にやってみたチーム開発での課題
KMMのコードへの理解iOSメンバー Androidメンバー KMMメンバーネイティブ KMM
KMMのコードへの理解iOSメンバー Androidメンバー KMMメンバービジネスロジック・インターフェースの理解KMMの利用箇所の把握ネイティブ KMM
KMMのコードへの理解ネイティブとKMMの相互理解を密に行うビジネスロジックを理解したiOSメンバーであれば、KotlinのコードさえかければKMMの実装を担うこともできる→iOSメンバーがKMMの実装に入ることもできる
まとめ
まとめ - KMMを使うことのメリットと役割分担KMMはiOSとAndroidで、同じコードを使うことでOS間の実装差異を無くすビジネスロジックをKMMで共通化するのが良い
まとめ - iOSエンジニアがKMMにもつ疑問Objective-CフレームワークになるCI/CDサービスでフレームワーク管理Android KMM iOSネイティブとKMMで平行して開発
まとめ - 実際にやってみたチーム開発での課題iOSメンバー Androidメンバー KMMメンバービジネスロジック・インターフェースの理解KMMの利用箇所の把握ネイティブ KMM
チームラボについてこのように我々はチーム開発について日々改善を進めております。ご興味・ご質問などある方はスポンサーブースで受け付けております。チームラボ 公式ページhttps://www.team-lab.com/