[Xcode7]Project Templateを自作したので作り方をざっとまとめる

More than 1 year has passed since last update.

Xcodeでアプリを作る際,プロジェクトの構成は自分やチームで大体決まっていると思います.
私は以下のような構成でいつも開発を行っていますが,毎回同じ構成を作るのは面倒です.

- Project
  - project_name
    - Classes
      - Config
      - Utility
      - Model
        - Entity
      - View
      - Controller
      - Layout
    - Resources
      - Font
      - Assets.xcassets

そこで,色々参考にしながらプロジェクトテンプレートを自作することにしたので,まとめることにします.
参考にした記事はこちら↓

準備

雛形となるファイルは既存のものをコピーします.
デフォルトのテンプレート置き場(環境によっては多少異なります.)である

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project\ Templates/

から,Single View Applicationと関連するファイルのテンプレートを使用します.
ターミナルで以下を実行します.

$ cd ~/Library/Developer/Xcode/Templates/Project\ Templates
$ mkdir MyTemplate
$ cd MyTemplate/
$ cp -R /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project\ Templates/iOS/Application/{Cocoa\ Touch\ Application\ Base.xctemplate,Storyboard\ Application.xctemplate,Single\ View\ Application.xctemplate} .

コピーしたSingle View Applicationのフォルダ名を好きな名前に変えます.

$ mv Single\ View\ Application.xctemplate MyTemplate\ Application.xctemplate/

準備はこれで終わりです.
Xcodeを開き,プロジェクトを新規作成すると,以下のようになっていることがわかると思います.

フォルダ構成

Xcode Projectのテンプレートは,継承できる構造になっており,テンプレートが細分化されています.
全て説明すると非常に長くなると思うので,今回使用するものだけ説明していきます.

まずはMyTemplateApplication.xctemplateから.
このフォルダは一番下の階層のテンプレートで,プロジェクト新規作成時にテンプレートとして現れるものです.
Single ViewMaster-Detailなんかですね.

- MyTemplate Application.xctemplate
  - Main.storyboard
  - TemplateIcon.tiff
  - TemplateInfo.plist

・Main.storyboard
 Storyboardの初期状態を指定できます.
 例えば,TabBarControllerをよく使うという人はこのファイルに
 配置しておけばプロジェクト立上げ時の手間を少し省けますね.

・TemplateIcon.tiff
 テンプレート選択画面のアイコンです.
 イラレなどで,テンプレートにあったアイコンにするといいと思います.

・TemplateInfo.plist
 ファイル構成やファイルの中身の記述ができます.
 今回はこのファイルをメインに弄っていきます.

 

- Storyboard Application.xctemplate
  - TemplateInfo.plist

次にStoryboard Application.xctemplateですが,こちらはInfo.plist周りの
Stroyboardの基本設定をするテンプレートになっています.
メインStoryboardのファイル名なんかを設定します.
MyTemplate Application.xctemplateの一つ上の階層のテンプレートです.

 

- Cocoa Touch Application Base.xctemplate
  - TemplateInfo.plist
  - LaunchScreen.storyboard
  - Images-iPad.xcassets
  - Images-iPhone.xcassets
  - Images-Universal.xcassets

その更に上の階層にあるCocoa Touch Application Base.xctemplateは,
Assetsの初期化ファイルやLaunchScreenの初期化ファイルの設定を行っているものです.

大体の役割がわかったところで,実際に中身を弄っていきます.

テンプレートの基本情報の変更

各テンプレートは,固有のIDにより管理されています.
このIDが被ると,どちらかは反映されません.
(現に今Xcodeを見てみると,SingleViewApplicationテンプレートが消えてしまっています.)
なのでまずは,IDを決めるところから入ります.

MyTemplate Application.xctemplateの中のTemplateInfo.plistを開いてください.
(見やすさの観点から,Xcodeで開いて説明していきます.)

 
基本情報設定.png

こんな感じの画面が出てくると思います.
この中のIdentifierに適当な文字列を記述してください.
Bundle IDのような逆ドメイン方式がいいかと思われます.

大まかに弄るであろう他の部分の説明をしておきます.

・Ancestors
 継承するテンプレートのIDを列挙します.

・Concrete
 この値が「YES」になっているものが,Xcodeのテンプレート選択画面で実際に現れるテンプレートになります.

・Description
 テンプレートの説明を記述できます.
 テンプレート選択画面の下の方に記載される内容です.

・SortOrder
 感じでわかると思いますが,テンプレートの表示順序を指定できます.

・Options
 テンプレート選択後の画面に出すオプションの設定です.(後述)

・Definitions
 ファイル内容や,別ファイルへの参照などを記述します.(後述)

・Nodes
 初期状態ではありませんが,実際に生成するファイルや内容を定義します.(後述)
 Definitionsと一緒に使っていくのが普通かと思われます.

 
Storyboard Application.xctemplateCocoa Touch Application Base.xctemplateも同様に,IDを書き直してください.

そして,MyTemplate Application.xctemplateStoryboard Application.xctemplateを,
Storyboard Application.xctemplateCocoa Touch Application Base.xctemplateを継承しているので,
各ファイルのAncestorsも書き換えるようにしてください.
com.apple.dt.unit.coreDataCocoaTouchApplicationは今回使わない(&設定箇所が増える)ので,今回は消してください.

フォルダの構成を記述

今回は,以下のような構成にしていこうと思います.

- Project
  - project_name
    + AppDelegate.swift
    + Info.plist
    - Classes
      - Config
      - Utility
      - Model
        - Entity
      - View
      - Controller
        + ViewController.swift
      - Layout
    - Resources
      - Font
      + Assets.xcassets

まずは,MyTemplate Application.xctemplate/下に,構成したいものと同じものを作ります.

- MyTemplate
  - Main.storyboard
  - TemplateIcon.tiff
  - TemplateInfo.plist
  - Classes
    - Config
    - Utility
    - Model
      - Entity
    - View
    - Controller
    - Layout
  - Resources
    - Font

こんな具合に作れたら,MyTemplate Application.xctemplate/TemplateInfo.plistを弄っていきます.
Nodesには実際のファイル構成を,Definisionsにはプロジェクトの構成を記述していきます.

Classes追加.png

フォルダ構成だけなら,ぶっちゃけこれだけでいけます.笑
ですが,中にファイルを入れたりとなると,(後ろで少し触れますが,)困ることになるので,
以下のように一番下の階層だけを記述していきます.

フォルダ構成追加.png

プロジェクトを作成してもらえるとわかりますが,この段階まででは,記述したものがフォルダと認識されません.
Definisionsのそれぞれの中身を記述していきましょう.

group指定.png

・Groups
 プロジェクト内でのフォルダを指定します.
 要素を増やすと階層構造になります.

・Path
 フォルダであることを認識させるために,実ファイルと関連付けます.
 先ほど作ったMyTemplate Application.xctemplate/フォルダ内のフォルダと一致させてください.

・SortOrder
 フォルダの表示順序の指定です.
 数字が大きいほど上の方に表示されます.

 
ここまで設定できたらプロジェクトを作ってみてください.

     

プロジェクト,実フォルダとも,ちゃんと構築されていることが確認できます.

ファイルを配置する

さて,続いては,ファイルを配置していきます.

デフォルトであるファイルは
- AppDelegate.swift
- Info.plist
- Main.storyboard
- LaunchScreen.storyboard
- ViewController.swift
- Assets.xcassets
となっているので,まずはこれらのファイルを配置していきます.
(AppDelegateとplistは,最上階層のテンプレートも弄らないといけなくなるので,今回はスルーします.)

Storyboardの配置

まずは,Main.storyboardから配置します.

Main.storyboardNodesは,Storyboard Application.xctemplateに記述されているので,こちらを開いてください.
NodesBase.lproj/Main.storyboardとなっている部分を,Classes/Layout/Main.storyboardとしてください.

Nodesの設定.png

この設定で,Main.storyboardのファイルはClasses/Layout下に配置されます.
続いてプロジェクト内の配置を行うために,MyTemplate Application.xctemplate/TemplateInfo.plistに設定を書きます.
フォルダの時と同様にGroupPathを書きなおします.

storyboard設定.png

こんな感じになりますね.

LaunchScreen.storyboardも同様に書き直してください.
LaunchScreen.storyboardCocoa Touch Application Base.xctemplate/TemplateInfo.plist内で両方設定できるかと思います.

launch設定.png

ViewControllerの配置

次に,ViewController.swiftの配置をしていきます.
MyTemplate Application.xctemplate/TemplateInfo.plistOptionsを見てみると,それっぽい記述が見れます.

options.png

これは,languageChoiceというオプションの値(Swift, Obj-C)によってファイルを書き換えていることを示しています.
languageChoiceは,プロジェクト名とか決めるときに選択するやつです.(ドロップダウンのやつ.)

このように.plist上でコードもかけますが,正直面倒くさいです.笑
パラメータの種類とかもよくわかっていません.笑
なので,テンプレートファイルを作ったほうが早い気がします.

ViewController.swift
//
//  ViewController.swift
//
//  Copyright © 2016年 Krimpedance. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

こんな感じのファイルを作り,MyTemplate Application.xctemplate/下に置いて,設定を書けばちゃんと追加されます.

VC設定.png

Assets.xcassetsの配置

このファイル(フォルダ?)は,iPhone, iPad, Universalで中身が変わってきます.
Cocoa Touch Application Base.xctemplateを見て貰えばわかりますが,それぞれ別のものが用意されています.

これも,先ほどのViewControllerと同様,OptionsuniversalDeviceFamilyのところで分岐させてあります.
これまでと同様に適切に設定を書き換えてあげます.

assets設定.png

載せてはいませんが,Nodesの方も忘れずに変えてください.

動作チェック

以上で一通りのテンプレートの作成は終了です.
新規プロジェクトを作成し,確認してみてください.

サンプル

https://github.com/krimpedance/MyTemplate

終わりに

今回は,普段の繰り返し作業を軽減するための一環としてプロジェクトテンプレートを作成してみました.
まだ細かい所の理解度が足りないですが,わりかし楽しかったです.
そのうちファイルテンプレートも作ってみますo(`ω´ )o

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.