Open12

KMMまとめ(KotlinだけでiOSアプリを作れるか)

しらかししらかし

テンプレート内に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
しらかししらかし

画像ビューアの公式サンプル
https://github.com/JetBrains/compose-multiplatform/tree/master/examples/imageviewer

iOSのコードはほぼすべてKotlinで書かれていた。
雰囲気的にはSwiftの代わりにKotlinで書けるという感じ。

しらかししらかし

Foundationのクラス、メソッドたちのドキュメントがAndroid Studioからは全く見えないのはコードを書いていく上でかなりつらそう

しらかししらかし

公式で紹介されているライブラリたち
https://kotlinlang.org/lp/multiplatform/

  • kotlinx.serialization
    • JSONやProtocolBuffersを扱うやつ
  • kotlinx.datetime
    • 日付と時刻
    • java.timeのKotlin版という雰囲気
  • Ktor(HTTP)
  • Apollo(GraphQL)
  • Okio
  • Arrow
    • Kotlinで関数型プログラミング
  • Koin(DI)
  • Kotest
    • テストフレームワーク
  • Store5
    • Repository層を作るときに便利そうなやつ
  • Reaktive
    • リアクティブなやつ
    • Kotlin/Nativeでのマルチスレッドをなんかうまいことしてくれそう(よくわからん)
  • SQLDelight
    • SQLを元に、Kotlinのdata classを生成できる
    • MultiplatformではSQLiteのみ対応
  • Realm
    • by MongoDB
    • ホームページのサンプルがどうみてもSwiftで草
  • Firebase
    • GitLive社によるKMM対応版