SDD(Sleep-Driven Development)

睡眠の重要性!!睡眠の重要性!!

Kotlin/NativeのiOSサンプルを動かしてみる

Kotlin/Nativeが頑張っているっぽいので、iOSのサンプルを実行してみました。

・・・実行しただけです。

環境

ちなみに

私はビルドし終わったあとに気づきましたが、GitHubReleaseにおそらく各種プラットフォーム向けにビルドされたやつがあるっぽいです。。

なのでそこから持ってきた場合は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になっているのでここを適当に変更します。

f:id:crocus7724:20171107021121p:plain

私は今回com.example.konanにしました。

また、SigningTeamを自分のに指定します。

次に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 PhasesReplace Binaryを以下のように修正。

cp "$SRCROOT/build/konan/bin/iphone/app.kexe" "$TARGET_BUILD_DIR/$EXECUTABLE_PATH"

f:id:crocus7724:20171107021339p:plain

さあエラーも消えたし実行!!してみるとビルドは通りますが、実行されません。

実はTargetをシミュレータにしていたのですが、どうやらシミュレータ用のバイナリを吐いてくれないらしく、再生ボタンを何回か押すと以下のようなメッセージが表示されます。

f:id:crocus7724:20171107021356p:plain

なので、MacbookiPhoneを繋いで実機ビルドしましょう!

実行ボタンを押すとビルドされ、実機デプロイされるのですが、以下のメッセージが表示され、初回は時間がかかります。

f:id:crocus7724:20171107021417p:plain

筋トレしていましょう。

うまくいけば実行できているはずです!!

f:id:crocus7724:20171107021511j:plain

お疲れ様でした!!

まとめ

仕組みはどうなっているのかなーと思ったのですが、.xcodeprojのBuild Phasesを見た感じ、

  • kotlinコードをkonanc?を使ってネイティブコンパイル
  • 成果物を$EXECUTABLE_PATH(konan.app/konan)にReplace

しているっぽいですね。

なのでobjcコードは完全にダミーでIBホニャララするくらいしか使わない感じ?

あと、現状唯一Kotlin/Nativeに対応しているIDEがCLionなのですが、開いてみた感じまだ対応されていないので補完なしで頑張るしかないっぽいですね(非常に辛い)。

また、Common moduleがない?(みつからなかった)のでネイティブAPIで頑張るしかないみたいです(非常に辛い)。

現状iOS開発するにはとてもとてもとても辛いですが、将来Common moduleが出たりIDE対応が進んだりすればきっと選択肢の中に一瞬入るようになると期待しています。