Kotlin/NativeのiOSサンプルを動かしてみる
Kotlin/Nativeが頑張っているっぽいので、iOSのサンプルを実行してみました。
・・・実行しただけです。
環境
- Macbook Pro(Mid 2015)
- Core i7, Memory 16GB
- macOS High Sierra
- Xcode 9.1
- kotlin/native 0.4
ちなみに
私はビルドし終わったあとに気づきましたが、GitHubのReleaseにおそらく各種プラットフォーム向けにビルドされたやつがあるっぽいです。。
なのでそこから持ってきた場合はiOSで実行できるようにするまで飛ばせるはずです。
時間が有り余っている人はCloneからお読み下さい。
kotlin-nativeリポジトリのClone
今回はKotlin/Nativeのリポジトリに含まれているsamples/uikitを実行してみたいと思います。 まずはリポジトリをClone。
$ git clone https://github.com/JetBrains/kotlin-native.git
次にkotlin-nativeのディレクトリに移動し、依存関連をダウンロード。
$ cd kotlin-native
$ ./gradlew dependencies:update
ちょっと時間がかかるかもしれません。軽く筋トレしていましょう。
そしてコンパイラや、各種プラットフォームのライブラリをコンパイル。
$ ./gradlew bundle
ただし、README.mdに
The build can take about an hour on a Macbook Pro.
と書かれている通り、ビルドに1時間近くかかります(私の環境で46分でした)。 待っている間は筋トレでもしてましょう。
ビルドが終わったらKotlin/Native側の準備は完了です。
さっそくiOSプロジェクトを見ていきましょう!
iOSで実行できるようにする
samples/uikit
に移動し、.xcodeprojをオープン。
$ cd samples/uikit
$ open konan.xcodeproj
早速実行、、、といきたいところですが、いくつか修正が必要です。
まず最初にBundle Identifierを変更します。
初期状態だとorg.jetbrains.konan
になっているのでここを適当に変更します。
私は今回com.example.konan
にしました。
また、Signing
のTeam
を自分のに指定します。
次にRunボタンをクリックしてみるとわかるのですが、ビルドが
cp: /~/kotlin-native/samples/uikit/build/konan/bin/app.kexe: No such file or directory
でこけます。
どうやらkotlinのコードをビルドしたとき、成果物がuikit/build/konan/bin
に吐き出される想定のはずなのですが、ないっぽいです。
実は成果物はuikit/build/konan/bin/iphone
に吐き出されるようなので単純にミスみたいです()
ということで、Build Phases
のReplace Binary
を以下のように修正。
cp "$SRCROOT/build/konan/bin/iphone/app.kexe" "$TARGET_BUILD_DIR/$EXECUTABLE_PATH"
さあエラーも消えたし実行!!してみるとビルドは通りますが、実行されません。
実はTargetをシミュレータにしていたのですが、どうやらシミュレータ用のバイナリを吐いてくれないらしく、再生ボタンを何回か押すと以下のようなメッセージが表示されます。
なので、MacbookにiPhoneを繋いで実機ビルドしましょう!
実行ボタンを押すとビルドされ、実機デプロイされるのですが、以下のメッセージが表示され、初回は時間がかかります。
筋トレしていましょう。
うまくいけば実行できているはずです!!
お疲れ様でした!!
まとめ
仕組みはどうなっているのかなーと思ったのですが、.xcodeprojのBuild Phasesを見た感じ、
しているっぽいですね。
なのでobjcコードは完全にダミーでIBホニャララするくらいしか使わない感じ?
あと、現状唯一Kotlin/Nativeに対応しているIDEがCLionなのですが、開いてみた感じまだ対応されていないので補完なしで頑張るしかないっぽいですね(非常に辛い)。
また、Common moduleがない?(みつからなかった)のでネイティブAPIで頑張るしかないみたいです(非常に辛い)。
現状iOS開発するにはとてもとてもとても辛いですが、将来Common moduleが出たりIDE対応が進んだりすればきっと選択肢の中に一瞬入るようになると期待しています。