Open12
KMMまとめ(KotlinだけでiOSアプリを作れるか)
Go 100% sharing with common UI
https://kotlinlang.org/lp/multiplatform/
UIは100%共有できるという触れ込みなのでそこを目指していきたい
まずはテンプレートをクローンするところから
テンプレートリポジトリになっているのでそのままUse this template
> Create a new repository
テンプレート内にswiftファイルが多少有るので100%Kotlinは達成できない(それはそう)
tree .
(src/res以下などのよくあるファイルは省略)
.
├── LICENSE.txt
├── README.md
├── androidApp
│ ├── build.gradle.kts
│ └── src
│ └── androidMain
│ ├── AndroidManifest.xml
│ ├── ic_launcher-playstore.png
│ ├── kotlin
│ │ └── com
│ │ └── myapplication
│ │ └── MainActivity.kt
│ └── res
├── build.gradle.kts
├── cleanup.sh
├── iosApp
│ ├── Configuration
│ │ └── Config.xcconfig
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ │ ├── Headers
│ │ ├── Local Podspecs
│ │ │ └── shared.podspec.json
│ │ ├── Manifest.lock
│ │ ├── Pods.xcodeproj
│ │ └── Target Support Files
│ │ ├── Pods-iosApp
│ │ │ ├── Pods-iosApp-Info.plist
│ │ │ ├── Pods-iosApp-acknowledgements.markdown
│ │ │ ├── Pods-iosApp-acknowledgements.plist
│ │ │ ├── Pods-iosApp-dummy.m
│ │ │ ├── Pods-iosApp-resources-Debug-input-files.xcfilelist
│ │ │ ├── Pods-iosApp-resources-Debug-output-files.xcfilelist
│ │ │ ├── Pods-iosApp-resources-Release-input-files.xcfilelist
│ │ │ ├── Pods-iosApp-resources-Release-output-files.xcfilelist
│ │ │ ├── Pods-iosApp-resources.sh
│ │ │ ├── Pods-iosApp-umbrella.h
│ │ │ ├── Pods-iosApp.debug.xcconfig
│ │ │ ├── Pods-iosApp.modulemap
│ │ │ └── Pods-iosApp.release.xcconfig
│ │ └── shared
│ │ ├── shared.debug.xcconfig
│ │ └── shared.release.xcconfig
│ ├── iosApp
│ │ ├── Assets.xcassets
│ │ ├── ContentView.swift
│ │ ├── Info.plist
│ │ ├── Preview Content
│ │ └── iOSApp.swift
│ ├── iosApp.xcodeproj
│ └── iosApp.xcworkspace
├── local.properties
├── settings.gradle.kts
└── shared
├── build.gradle.kts
├── shared.podspec
└── src
├── androidMain
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── main.android.kt
├── commonMain
│ ├── kotlin
│ │ └── App.kt
│ └── resources
│ └── compose-multiplatform.xml
└── iosMain
└── kotlin
└── main.ios.kt
Compose for iOSはCocoaPodsになるっぽい。
KMMでiOS用ライブラリを作るときは
- XCFramework(ライブラリ専用。アプリでは選べない)
- CocoaPods Dependency Manager
- Regular framework
の3種類から選べるけれども何がどういうときに向いているのかよくわからない。
AndroidStudioにKMMプラグインを入れてプロジェクトを生成したときと大差なさそうに見える。
CocoaPods指定して新規プロジェクトを作ったときの図
.
├── androidApp
│ ├── build.gradle.kts
│ └── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ └── crakac
│ │ └── sampleapp
│ │ └── android
│ │ ├── MainActivity.kt
│ │ └── MyApplicationTheme.kt
│ └── res
│ └── values
│ └── styles.xml
├── build.gradle.kts
├── iosApp
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ │ ├── Headers
│ │ ├── Local Podspecs
│ │ │ └── shared.podspec.json
│ │ ├── Manifest.lock
│ │ ├── Pods.xcodeproj
│ │ └── Target Support Files
│ │ ├── Pods-iosApp
│ │ │ ├── Pods-iosApp-Info.plist
│ │ │ ├── Pods-iosApp-acknowledgements.markdown
│ │ │ ├── Pods-iosApp-acknowledgements.plist
│ │ │ ├── Pods-iosApp-dummy.m
│ │ │ ├── Pods-iosApp-frameworks-Debug-input-files.xcfilelist
│ │ │ ├── Pods-iosApp-frameworks-Debug-output-files.xcfilelist
│ │ │ ├── Pods-iosApp-frameworks-Release-input-files.xcfilelist
│ │ │ ├── Pods-iosApp-frameworks-Release-output-files.xcfilelist
│ │ │ ├── Pods-iosApp-frameworks.sh
│ │ │ ├── Pods-iosApp-umbrella.h
│ │ │ ├── Pods-iosApp.debug.xcconfig
│ │ │ ├── Pods-iosApp.modulemap
│ │ │ └── Pods-iosApp.release.xcconfig
│ │ └── shared
│ │ ├── shared.debug.xcconfig
│ │ └── shared.release.xcconfig
│ ├── iosApp
│ │ ├── Assets.xcassets
│ │ ├── ContentView.swift
│ │ ├── Info.plist
│ │ └── iOSApp.swift
│ ├── iosApp.xcodeproj
│ └── iosApp.xcworkspace
├── local.properties
├── settings.gradle.kts
└── shared
├── build.gradle.kts
├── shared.podspec
└── src
├── androidMain
│ └── kotlin
│ └── com
│ └── crakac
│ └── sampleapp
│ └── Platform.kt
├── commonMain
│ └── kotlin
│ └── com
│ └── crakac
│ └── sampleapp
│ ├── Greeting.kt
│ └── Platform.kt
└── iosMain
└── kotlin
└── com
└── crakac
└── sampleapp
└── Platform.kt
記事内で紹介されているリソース読み込み用ライブラリ
We are Kotlin Multiplatform experts
トップページにとても力強い言葉があるので、ここのライブラリ群はチェックしておく価値がありそう。
画像ビューアの公式サンプル
iOSのコードはほぼすべてKotlinで書かれていた。
雰囲気的にはSwiftの代わりにKotlinで書けるという感じ。
公式で紹介されているライブラリたち
-
kotlinx.serialization
- JSONやProtocolBuffersを扱うやつ
-
kotlinx.datetime
- 日付と時刻
- java.timeのKotlin版という雰囲気
- Ktor(HTTP)
- Apollo(GraphQL)
-
Okio
- 元はOkHttpの一部
- java.io, java.nioを補完するために作られた
- MultiPlatform対応
-
https://speakerdeck.com/swankjesse/ok-multiplatform-droidcon-nyc-2018
- スライドではokio2について書かれているが、2023年5月現在ではokio3(3.3.0)がリリースされてる
-
Arrow
- Kotlinで関数型プログラミング
- Koin(DI)
-
Kotest
- テストフレームワーク
-
Store5
- Repository層を作るときに便利そうなやつ
-
Reaktive
- リアクティブなやつ
- Kotlin/Nativeでのマルチスレッドをなんかうまいことしてくれそう(よくわからん)
-
SQLDelight
- SQLを元に、Kotlinのdata classを生成できる
- MultiplatformではSQLiteのみ対応
-
Realm
- by MongoDB
- ホームページのサンプルがどうみてもSwiftで草
-
Firebase
- GitLive社によるKMM対応版