RubyMotion 6.1 環境構築

# 要旨

RubyMotion 6.0が今月(2019年4月)初めにリリースになりました。
Android用のパッチが12日にでて最新のバージョンは6.1です。

最近のAppleの方針や変化に振り回されていて、5.xの後半は追いつくのが大変そうだなと感じていて、アプリの更新も綱渡り的な状態で行なっていました。

6.0がXcode 10.2対応版となります。

まだ更新したばかりですが、今までのアプリが無事に動作したので、バージョンアップ手順を記録しておきます。


# インストール or 更新

## 新たにインストールする場合

RubyMotionをインストールするには、ダウンロードサイトでプランを選んで必要事項を入力すると、インストーラのダウンロードリンクが送られてきて、そこからダウンロードします。
Starterは制約はありますが、無料で利用できます。

<img width="559" alt="スクリーンショット 2019-04-13 10.38.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/03aa79a3-f4e4-1ef3-1fe3-5fc9dad90a53.png">

<img width="460" alt="スクリーンショット 2019-04-13 10.39.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/2be6f3eb-ab0b-a02c-f1d9-aa6a468985be.png">

(下の更新のみでダウンロードからの手順を利用することはないので、違っている箇所があれば訂正します。)

## 更新する場合

更新する場合はターミナルで```motion update```を実行するだけです。

```
$ sudo motion update
```

しかし、最近のシステム変更のせいかlicenseの期限切れという表示が出てしまいました。

```
Your software license is expired, please visit http://account.rubymotion.com to renew.
```

[Slack](https://motioneers.herokuapp.com)の方で同様の現象があがっていて、連絡すると正しいライセンスキーを教えもらう事ができます。
そのキーでactivateしてから更新します。

```
$ motion activate your_license_key
$ sudo motion update
```


## 環境構築

環境構築はほぼChange Logに書いているままですので、Change Logを併せてご覧ください。
Change Logは以下のコマンドで確認できます。

```
$ motion changelog
```

RubyMotion 6.0からはMojave 10.14.4、 Xcode 10.2が必須環境となります。
AppleもXcode 10.2でビルドしないとアプリを受け付けない方針ですので、アプリを公開したい場合はRubyMotion 6.0以降を使う必要があります。

Mojaveが必須となっていますので、High Sierraを使っている場合はMojaveにする必要があります。(ここではMojaveにする手順は説明しません)

### 1. Xcode 10.2インストール  

AppStoreからXcodeをインストールすることは推奨されていません。
RubyMotionが最新のバージョンに対応するまで遅延があり、自動更新されて突然ビルドできないということに陥ったりすることがあるからだと思います。

自動更新されない様にDeveloperサイトよりダウンロードしてインストールします。
一見ダウンロードできない様に見えますが、ダウンロードページ右上のMoreをクリックしxcodeで検索すると見つかります。

![d2f64e29f8afad42150ea4846c65fcdc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/7c21ea7d-f4c8-7416-05d1-a4b2d01750bc.png)

ダウンロードしたファイルを展開するとXcodeアプリがありますので、/Applicationsにコピーします。
前のバージョンを残す場合は、前のXcodeの名前を変えるなどしてからコピーします。

### 2. XcodeのAccount設定

Xcodeを開きます。
Command line toolsのインストール画面が出た場合はそのままインストールします。
Xcodeが開いたらPreferenceのAccountを開いてApple IDでサインインします。  
![757cce50c31c19c190895ea6da5a0160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8941/3324461a-2ffa-543d-44dc-9d5d2e00f2d6.png)

### 3. Xcode Command line toolsインストールとXcodeアプリ選択

まだCommand line toolsをインストールしていない場合はターミナルで以下のコマンドを実行します

````
$ sudo xcode-select --install && sudo xcode-select --reset
```

Command line toolsをインストールしている場合は、```xcode-select```の方だけでいいです。
複数のXcodeがある場合に```xcode-select```で切り替えて使うことができます。今までこのコマンドを使ったことがなければ問題ありませんが、もし別のバージョンを指定していたらリセットしてXcode 10.2が選ばれる様にします。

```
$ sudo xcode-select --reset
```

### 4. macOS SDK ヘッダーインストール

2.の手順ではmacOS用SDKのヘッダはインストールされていない様で、以下のコマンドでインストールします。

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

### 5. homebrewのクリーンインストール

homebrewのクリーンインストールはChange Logで **strongly recommended** となっています
homebrewで色々インストールしていたりすると思いますが、古い頃からの負の遺産を持っていたりすると不整合でうまくいかない場合があるので、クリーンインストールした方がいいということだと思います。

Change Logに従って以下の様にしますが、この手順は https://docs.brew.sh/FAQ に書かれているということです。

```brew list```でhomebrewでインストールしているモジュールのリストが表示されますので、必要なら控えます。(後で再度追加する際の目安になるでしょう。)

以下のコマンドでhomebrewをアンインストールします。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```

そして再インストールします。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

RubyMotionで必須のモジュールをhomebrewでインストールします。

```
$ brew install gcc
$ brew install cmake
$ brew install libxml2
$ brew install sqlite
$ brew install rbenv
```

rubyをインストールします。
2.3.7以上を推奨していますので、説明通り2.3.7をインストールします。たぶん最新版でも問題ないと思います。

```
$ rbenv install 2.3.7
```

プロジェクト内でバージョンを固定しておきましょう。固定しないと別のRubyバージョンを参照してGemがないなどの影響がでます。

```
$ rbenv local 2.3.7
```

rvmでも使えると思いますが、rbenvで説明されているので、今後のことを考えてrbenvにしていた方が無難かもしれません。
今まではrvmを使ってきましたが、Mojaveになってからrbenvに切り替えました。

### 6. 既存のプロジェクトのビルド

RubyMotionのバジョンアップなどで環境が変わった際はクリーンビルドする必要があります。
```rake rake pod:install```はCocoaPodsを使用している場合のみ行います。

```
$ rake clean:all
$ rake rake pod:install
$ rake
```

通常はこれでいいはずですが、エラーが出てしまいました。

```
objc[70585]: Class __SwiftNativeNSIndexSetBase is implemented in both /usr/lib/swift/libswiftCore.dylib (0x7fff97c92e98) and /Applications/Xcode.app/Contents/Frameworks/libswiftCore.dylib (0x10f6f6f20). One of the two will be used. Which one is undefined.
This copy of libswiftCore.dylib requires an OS version prior to 10.14.4.
```

この場合は7を行います。

### 7. dylibのコピー

これはChange Logに書かれていませんが、6の様にエラーが出てしまった場合に行います。
(Slackのやり取りの中で書かれています)

詳しくは分かりませんが```/Applications/Xcode.app/Contents/Frameworks```にはいくつか不足しているものがあって、```/usr/lib/swift```から補うという事でしょう。

```
$ cp -r /usr/lib/swift/*.dylib /Applications/Xcode.app/Contents/Frameworks
```

ここまででアプリが起動できる様になりました。

iOSの場合は__11.2__からのサポートになりますので、iOS 10対応したい場合は以前のRubyMotionのバージョンを利用することになるのですが、iTunes ConnectではXcode 10.2でビルドしたものしか受け付けないので、残念ながらiOS 10対応は諦めるしかありません。

必要に応じてRakefileでdeployment_targetを指定します。

```
app.deployment_target = '11.2'
```

# 今後は…

RubyMotionがAmir Rajanさんに引き継がれどうなることか？という事で、下火になった感じがありますが、まだアプリを継続して開発していけてます。

とはいうものの、Apple Watch Series 4のバイナリーは対応できてなくて(<del>6.1ではまだ試してません</del> 6.1でまだ対応できてませんでした。)レイアウト改善の要望はあるものの更新できなくて歯がゆいところはあります。
(Apple Watch Series 4 実機を持ってなくて確認できないながらも最大限頑張ってはみたので、お知り合いでApple Watch Series 4あるから確認してくれるという方がいましたらご連絡ください。)

今後はDragonRuby LLCと新体制のもとで進められていくという事で、今までより加速することを期待してます。

[RubyKaigi 2019](https://rubykaigi.org/2019)では[Building a game for the Nintendo Switch using Ruby](https://rubykaigi.org/2019/presentations/amirrajan.html#apr19)というテーマでAmir Rajanさんが話されます。
RubyMotion、Nintendo Switch、DragonRubyというキーワードから推測すると明るい未来が語られるのではないかと期待してます。

残念ながら今年のRubyKaigiは参加できないばかりか、生中継をリアルタイムでも見れないので録画が公開されるのを待ちます。

福岡行きたかったな〜
皆さん楽しんでください。