Xcode11で古いプロジェクトテンプレートを利用する

## 動機
先日iOS13がリリースされましたが、アプリを新規に始める場合に、iOS11〜1OS13あたりをターゲットに設定することは、まだまだあるかと思います。

開発では、新しいXcode11をメインに使用したいのですが、`Single View App`テンプレートでプロジェクトを新規作成した場合、そのままターゲット設定をiOS13未満にするとScenes関連のclassが使用できないため**コンパイルエラー**がでます。
**[Scenes](https://developer.apple.com/documentation/uikit/app_and_environment/scenes)**とは、iOS13で登場したひとつのアプリプロセスに対してマルチUI（マルチウインドウ）をサポートするための仕組みのようで、現状では主にiPadでの用途があるようです。これによって`SceneDelegate.swift`と関連設定が、デフォルトのプロジェクトに含まれているためです。

ターゲットiOSバージョンによってはXcode11で、Scenes関連の設定が含まれないXcode10バージョンの`Single App Viewテンプレート`もまだまだ使いたい時があるなあ、と思ったのでXcode10からコピーしてXcode11からも使えるようにしておけば便利かもと思った次第です。

というわけで、当記事ではXcodeのカスタムテンプレート追加手順を、表題の件に絞ってまとめておきます。

## そもそもそういう頻度が少ない場合
そんなにプロジェクト新規作成の頻度が少ない場合、後述するテンプレートのコピーをしなくても、Xcode10&11併用環境であれば**iOS12〜以下をターゲットする場合、普通にXcode10.3でプロジェクトを新規作成して開始すれば大丈夫**です。そうでない場合は、新規作成のためだけに古いXcodeを保持しておかなければならない、というデメリットがあります。（マイグレーションが必要な時などに役には立つのですが）

または**手作業でXcode11で作成したプロジェクトの`SceneDelegate.swift`などを消す**ことも可能。しかし何度も行う場合には省略したいとも思います。
- [Xcode 11 - Opt out of UISceneDelegate/SwiftUI on iOS 13](https://stackoverflow.com/questions/57467003/xcode-11-opt-out-of-uiscenedelegate-swiftui-on-ios-13)
- [How to remove SceneDelegate code from iOS 13 project?](https://webcache.googleusercontent.com/search?q=cache:ED7Ut-48xh0J:https://stackoverflow.com/questions/58067383/how-to-remove-scenedelegate-code-from-ios-13-project+&cd=2&hl=ja&ct=clnk&gl=jp&lr=lang_en%7Clang_ja)

## テンプレートのコピー手順
では、Xcode10から古いタイプの`Single View App`のプロジェクトテンプレートをコピーしてきて**独自のテンプレート**として、Xcode11で使えるようにします。

作業後の完成イメージのキャプチャですが、作業後にはプロジェクト作成ウィザードに画像のような形で選択出来るようになります。

<img width="1018" alt="スクリーンショット 2019-09-27 17.23.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/f1d17c55-98ea-448e-f54a-2d5aa7636e54.png">

#### カスタムテンプレート用のフォルダを作成
Xcode独自テンプレートは以下のパス配下に追加する決まりになってます。

```zsh
# 独自Projectテンプレートのパス
~/Library/Developer/Xcode/Templates/Project\ Template
# 独自Fileテンプレートのパス
~/Library/Developer/Xcode/Templates/File\ Template
```

テンプレートを置くフォルダを作成。テンプレートのカテゴリ表示はフォルダ名が反映されるので`My Templates`という名前のフォルダを作成することにします。

```zsh
$ mkdir -p ~/Library/Developer/Xcode/Templates/Project\ Templates/My\ Templates
```

#### Xcode10.3からのテンプレート複製
フォルダの準備ができましたので、次は中身です。プロジェクト新規作成ウィザードに表示されるテンプレートは`Xcode.app`パッケージを開いた中に入ってますので、そいつをコピーします。[Xcode10.3がない場合はダウンロードしてくる](https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_10.3/Xcode_10.3.xip)必要があります。Xcode.appを右クリックから`パッケージの内容を表示`で辿っていくか、以下のコマンドを実行して開きます。

```zsh
# パスの中の`Xcode_10.3.app`部分は適宜変更してください。
open /Applications/Xcode_10.3.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project\ Templates/iOS/Application/
```

Finderで操作するか、以下のコマンドを実行し`Xcode_10.3.app`のパッケージの中から`Single View App.xctemplate`をカスタムテンプレート用フォルダへとコピーします。

```zsh
cp -r /Applications/Xcode_10.3.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project\ Templates/iOS/Application/Single\ View\ App.xctemplate ~/Library/Developer/Xcode/Templates/Project\ Templates/My\ Templates/Single\ View\ App.xctemplate
```
追記（2019/09/29）：
**<font color="Red">[重要] テンプレートのIdentifierがXcode11のオリジナルと重複していると、ウィザードにオリジナルの方のSingle View Appアイコンが表示されなくなってしまっていた</font>**ので、
**コピーした方の`Single View App.xctemplate`の中の`TemplateInfo.plist`ファイルを開いて（Xcodeが起動するはず）`Identifier`部分を何か好きな文字列に編集を行います**。（↓画像の例ではオリジナルの文字列に`_Xcode10.3`をを付加しました。）

<img width="801" alt="スクリーンショット 2019-09-29 17.06.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53174/00cc030e-1f18-d4c6-027b-4127dfb5436a.png">

作業は以上で完了です。

## 確認
Xcode11を開いて、プロジェクト新規作成のウィザードを起動します。

- `File -> New -> Project...`を選択か、または、ショートカットキーで`Cmd + Shift + N`です。

Xcode10からカスタムテンプレートとしてコピーした`Single View App`が`My Templates`項目に表示されており、選択するとScenes関連なしのプロジェクトを開始出来るようになっているはずです。

## まとめ
Xcodeでは、最新のAPIに合わせたテンプレートへ変わることは珍しくないように思いますので、過渡期期間では今後も役に立つかもしれません。

## 参考🙏
- [Creating Custom Xcode Project Templates](https://useyourloaf.com/blog/creating-custom-xcode-project-templates/)
- [Xcodeのファイルテンプレートを自作する](https://qiita.com/shu223/items/5d8a245e5743f77df9eb)