Xcode
iOS
Swift
cmdshelf

Xcodeのバージョンが古くて最新OSでデバッグできません?

Swift愛好会のアドベントカレンダー2日目担当の @toshi0383 です。
小ネタを投下します!

An error was encountered while enabling development on this device

使っているXcodeよりもOSが先に新しくなってしまって、こういうエラーが出ることがあります。
Screen Shot 2017-11-22 at 11.40.04.png

デバイス再起動してとか書いてありますが、単純にXcodeが古くてOSのサポートファイルがないために起きることが多いです。
以下のようにDeviceSupportのディレクトリを見てみると、Xcode9.1には11.1のイメージがありますが、Xcode9.0.1にはないことがわかります。
Screen Shot 2017-11-22 at 11.40.36.png

新しいXcodeをダウンロードしてもいいですが、最近になってもまだちょっとバージョンを上げるとSwiftの互換性がなくなったりするので、単純に11.1のフォルダごとコピーして同じ状態にしてあげましょう。
Xcodeを再起動すると設定が読み込まれて上のエラーが出なくなると思います。

DeviceSupportってどこよ

ただこのDeviceSupportは結構深いところにあるので、探すのが面倒です。
毎回消耗していたので、以下のスクリプトを書きました。
https://github.com/toshi0383/scripts/blob/master/xcode/open-device-support-dir.sh

これを使うと、コマンド一発でインストールされているXcodeそれぞれのDeviceSupportを探して、上記のようにFinder窓をパパッと表示してくれます。

cmdshelfで管理

cmdshelfで管理していると、スクリプトの更新もすぐに反映することができて便利ですね。

$ cmdshelf remote add toshi0383-scripts git@github.com:toshi0383/scripts.git
$ cmdshelf run xcode/open-device-support-dir.sh tvOS

コマンド名の一部しか思い出せないときもcmdshelf listからgrepできます。

$ cmdshelf list | grep device
    xcode/open-device-support-dir.sh

私もさっき思い出せなくて「あーそれそれ。」という感じでした。

自分が何を実行しているのか気になる人はcmdshelf catしましょう。

$ cmdshelf cat xcode/open-device-support-dir.sh | head
#!/bin/bash
OS=${1:-'[a-z]'}
for xcode in `ls -d /Applications/Xcode*.app`
do
    case $OS in
    i[oO][sS])
        dirs="$dirs ${xcode}/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport"
        ;;
    tv[oO][sS])
        dirs="$dirs ${xcode}/Contents/Developer/Platforms/AppleTVOS.platform/DeviceSupport"

まとめ

オラにスターを分けてくれ。
https://github.com/toshi0383/cmdshelf

明日はSwift愛好会のUI番長 @fumiyasac@github が何か書くそうです。
楽しみです!