1つのKotlinプロジェクトがAndroid、iOS、Web、Wear OS、AIエージェントをカバーする方法
Kotlin Multiplatformの能力を実際のコードでデモする必要があるとき、複雑なアーキテクチャや数十もの抽象化レイヤーにはまってしまうことは很容易です。John O'Reillyは異なるアプローチを取りました。。彼はシンプルなタスクを選択しました:軌道上にある人々のリストとISS座標を表示することです。その結果が、单一のビジネスロジックモジュールが десятокもの異なるプラットフォームで動作する仕組みの明確な例となっています。
このプロジェクトは公式KotlinドキュメントとGoogle Dev Libraryに掲載されました。すべての構造と、なぜこのコードベースが便利なサンドボックスになるのかを見てみましょう。
プロジェクトの概要
このアプリは無数のソースからデータを取得します биографиями宇宙飛行士のリストはThe Space Devs APIから、ISS座標はOpen Notify API経由で取得されます。クライアントがサードパーティサービスに直接アクセスしないようにするために、リポジトリには小さなKtorバックエンドが含まれています。
ここでの主なアイデアはコードの重複排除です。ビジネスロジック、ネットワークリクエスト、キャ싱、データモデルは共有モジュール common で一度だけ記述されます。このコード затемはあらゆる異なるOSやスクリーンに対応するクライアントに接続します。
サポートされているターゲットのリストには以下が含まれます:
- Glance APIを使用したAndroidスマートフォンとホーム画面ウィジェット
- SwiftUIでビルドされたiOSアプリ
- Wear OSを実行するスマートウォッチ
- Compose for Desktopによるデスクトップバージョン
- Kotlin/Wasmを使用したWebクライアント
- Ktorによるサーバーサイドコンポーネント
- AIクライアントに接続するためのMCPサーバー
共有モジュールの内部構造
モジュール common はすべてのボイラープレートを処理します。Kotlin開発者におなじみのライブラリを使用しています:
- Ktor Clientがネットワークリクエストを処理
- SQLDelightがローカルデータベースストレージを担当
- Koinが依存性注入を処理
- Kotlinx SerializationがJSONをパース
Compose MultiplatformとSKIEライブラリがUIとの通信を処理します。後者は корутин と Flow をiOS開発者が理解できるasync概念に変換することで、Swiftでの作業を大幅に簡素化します。
class PeopleInSpaceViewModel(
private val peopleInSpaceRepository: PeopleInSpaceRepositoryInterface
) : KMMViewModel() {
val peopleInSpace: StateFlow<List<Assignment>> =
peopleInSpaceRepository.fetchPeopleAsFlow()
.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}
この分離により、プラットフォームクライアントは薄いままです。UIレンダリングとユーザーのタッチイベントのみを処理します。
スマートウォッチからWebブラウザまで
リポジトリ内の各クライアントは отдельныйモジュールとして構造化されています。これにより、特定のテクノロジーが共有KMPコードとどのように統合されるかを быстро理解できます。
AndroidアプリはJetpack Composeでビルドされています。その隣には wearApp モジュールがあり、インターフェースはCompose for Wear OSを使用して丸いウォッチスクリーンに適応されています。Glance APIで書かれた動作するAndroidホーム画面ウィジェットも見つけることができます。
iOSの場合、著者は2つのパスを提供しています:クラシックなSwiftUIインターフェースまたは共有Composeコード。選択は開発者に委ねられています。
ブラウザバージョンはKotlin/Wasmでビルドされています。ビルドは標準的なGradleタスク経由で実行され、JavaScriptを一行も書くことなく動作するフロントエンドを生成します。
MCP経由でClaude Desktopに接続する
リポジトリへの最新の追加の1つは mcp-server モジュールです。著者は公式Kotlin MCP SDKを使用してModel Context Protocolでサーバーを実装しました。
アイデアは、ビジネスロジックとネットワークレイヤーを持つ同じ common モジュールがコンソールアプリケーションに引き出されるということです。このアプリケーションは人工知能用のツールを公開します。ローカルサーバーを実行することで、Claude Desktopまたはその他のアシスタントに接続できます。
Claude Desktopの設定は以下のようになります:
{
"mcpServers": {
"kotlin-peopleinspace": {
"command": "java",
"args": [
"-jar",
"/path/to/repo/mcp-server/build/libs/serverAll.jar",
"--stdio"
]
}
}
}
その後、ニューラルネットワークはデータ取得機能への直接アクセスを取得し、KMPコードから新鮮な情報を取得して宇宙飛行士についての質問に答えることができます。

このリポジトリを確認する理由
PeopleInSpaceリポジトリはコードの規模ではなく、最新の技術スタックのために価値があります。著者はKotlin、Gradle、Compose、関連ライブラリのバージョンを常に更新しています。
このプロジェクトは、以下を計画している場合に良いリファレンスになります:
- AndroidとiOSの間で実際にどれだけのコードを再利用できたかを評価する。
- ブラウザでKotlin/Wasmが実際に動作するのを見る。
- Swiftにデータストリームを渡すときのSKIEの動作を把握する。
- KotlinでMCPサーバーをビルドする方法を学ぶ。
始めるには、リポジトリをクローンし、最新バージョンのAndroid Studioで開いて、目的のGradleタスクを実行するだけです。
関連プロジェクト