Xcodeでアプリを作る際,プロジェクトの構成は自分やチームで大体決まっていると思います.
私は以下のような構成でいつも開発を行っていますが,毎回同じ構成を作るのは面倒です.
- Project
- project_name
- Classes
- Config
- Utility
- Model
- Entity
- View
- Controller
- Layout
- Resources
- Font
- Assets.xcassets
そこで,色々参考にしながらプロジェクトテンプレートを自作することにしたので,まとめることにします.
参考にした記事はこちら↓
- http://d.hatena.ne.jp/kimuraw/20120905/p1
- http://ashplanning.blogspot.jp/2015/02/xcode-6.html
- http://www.telerik.com/blogs/how-to-create-custom-project-templates-in-xcode-7
準備
雛形となるファイルは既存のものをコピーします.
デフォルトのテンプレート置き場(環境によっては多少異なります.)である
/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 View
やMaster-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で開いて説明していきます.)
こんな感じの画面が出てくると思います.
この中のIdentifierに適当な文字列を記述してください.
Bundle IDのような逆ドメイン方式がいいかと思われます.
大まかに弄るであろう他の部分の説明をしておきます.
・Ancestors
継承するテンプレートのIDを列挙します.
・Concrete
この値が「YES」になっているものが,Xcodeのテンプレート選択画面で実際に現れるテンプレートになります.
・Description
テンプレートの説明を記述できます.
テンプレート選択画面の下の方に記載される内容です.
・SortOrder
感じでわかると思いますが,テンプレートの表示順序を指定できます.
・Options
テンプレート選択後の画面に出すオプションの設定です.(後述)
・Definitions
ファイル内容や,別ファイルへの参照などを記述します.(後述)
・Nodes
初期状態ではありませんが,実際に生成するファイルや内容を定義します.(後述)
Definitionsと一緒に使っていくのが普通かと思われます.
Storyboard Application.xctemplate
,Cocoa Touch Application Base.xctemplate
も同様に,IDを書き直してください.
そして,MyTemplate Application.xctemplate
はStoryboard Application.xctemplate
を,
Storyboard Application.xctemplate
はCocoa 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
にはプロジェクトの構成を記述していきます.
フォルダ構成だけなら,ぶっちゃけこれだけでいけます.笑
ですが,中にファイルを入れたりとなると,(後ろで少し触れますが,)困ることになるので,
以下のように一番下の階層だけを記述していきます.
プロジェクトを作成してもらえるとわかりますが,この段階まででは,記述したものがフォルダと認識されません.
Definisions
のそれぞれの中身を記述していきましょう.
・Groups
プロジェクト内でのフォルダを指定します.
要素を増やすと階層構造になります.
・Path
フォルダであることを認識させるために,実ファイルと関連付けます.
先ほど作ったMyTemplate Application.xctemplate/
フォルダ内のフォルダと一致させてください.
・SortOrder
フォルダの表示順序の指定です.
数字が大きいほど上の方に表示されます.
ここまで設定できたらプロジェクトを作ってみてください.
プロジェクト,実フォルダとも,ちゃんと構築されていることが確認できます.
ファイルを配置する
さて,続いては,ファイルを配置していきます.
デフォルトであるファイルは
- AppDelegate.swift
- Info.plist
- Main.storyboard
- LaunchScreen.storyboard
- ViewController.swift
- Assets.xcassets
となっているので,まずはこれらのファイルを配置していきます.
(AppDelegateとplistは,最上階層のテンプレートも弄らないといけなくなるので,今回はスルーします.)
Storyboardの配置
まずは,Main.storyboard
から配置します.
Main.storyboard
のNodes
は,Storyboard Application.xctemplate
に記述されているので,こちらを開いてください.
Nodes
のBase.lproj/Main.storyboard
となっている部分を,Classes/Layout/Main.storyboard
としてください.
この設定で,Main.storyboard
のファイルはClasses/Layout
下に配置されます.
続いてプロジェクト内の配置を行うために,MyTemplate Application.xctemplate/TemplateInfo.plist
に設定を書きます.
フォルダの時と同様にGroup
やPath
を書きなおします.
こんな感じになりますね.
LaunchScreen.storyboard
も同様に書き直してください.
LaunchScreen.storyboard
はCocoa Touch Application Base.xctemplate/TemplateInfo.plist
内で両方設定できるかと思います.
ViewControllerの配置
次に,ViewController.swift
の配置をしていきます.
MyTemplate Application.xctemplate/TemplateInfo.plist
のOptions
を見てみると,それっぽい記述が見れます.
これは,languageChoice
というオプションの値(Swift, Obj-C)によってファイルを書き換えていることを示しています.
languageChoice
は,プロジェクト名とか決めるときに選択するやつです.(ドロップダウンのやつ.)
このように.plist上でコードもかけますが,正直面倒くさいです.笑
パラメータの種類とかもよくわかっていません.笑
なので,テンプレートファイルを作ったほうが早い気がします.
//
// 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/
下に置いて,設定を書けばちゃんと追加されます.
Assets.xcassetsの配置
このファイル(フォルダ?)は,iPhone, iPad, Universalで中身が変わってきます.
Cocoa Touch Application Base.xctemplate
を見て貰えばわかりますが,それぞれ別のものが用意されています.
これも,先ほどのViewControllerと同様,Options
のuniversalDeviceFamily
のところで分岐させてあります.
これまでと同様に適切に設定を書き換えてあげます.
載せてはいませんが,Nodes
の方も忘れずに変えてください.
動作チェック
以上で一通りのテンプレートの作成は終了です.
新規プロジェクトを作成し,確認してみてください.
サンプル
終わりに
今回は,普段の繰り返し作業を軽減するための一環としてプロジェクトテンプレートを作成してみました.
まだ細かい所の理解度が足りないですが,わりかし楽しかったです.
そのうちファイルテンプレートも作ってみますo(`ω´ )o