模板位置
- 全局位置
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates//Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates
- 用戶(hù)自定義位置:
~/Library/Developer/Xcode/Templates/
這里我們一般操作用戶(hù)自定義位置。

logo
logo必須名稱(chēng)為:TemplateIcon.tiff,存放位置跟TemplateInfo.plist同級(jí),在*.xctemplate的一級(jí)目錄下,正方形即可4848,6464
工程模板
參數(shù)含義
| Keys | need | Advice | ||
|---|---|---|---|---|
| Ancestors | No | Import settings from another Project Template. | ||
| Concrete | Recommended | Visible or hide Template form New Project Window. | ||
| Definitions | No | Work with workplace. Can write to file example source code. | ||
| Description | Recommended | New Project Window – Project Template Description.rs | No | Import settings from another Project Template. |
| Identifier | Yes | Project Template Unique Identifier. | ||
| Kind | Yes | XCode Template Kind. Project or File. | ||
| Nodes | Recommended | Create or Copy Files to Project. Copy works | ||
| Options | Recommended | New Project Wizard >> Choose Options for Project. Add Text Fields, Combo Boxes. | ||
| Platforms | Recommended | Set Platform. | ||
| Project | Yes | Set Project Build Settings. | ||
| Targets | Recommended | Set Build Settings, Build Phases for Targets. Link Libraries. |
- 上面列出了TemplateInfo.plist大部分鍵,詳細(xì)介紹在 這里 。
工程模板定制
工程模板里面除了logo標(biāo)簽,最主要的就是要修改工程的結(jié)構(gòu),比如一些預(yù)定的Group,一些實(shí)現(xiàn)編寫(xiě)好的文件:

- 首先要修改下“Identifier”字段,以防沖突。
Xcode模板是支持繼承的,或者叫做Import,這里
Ancestors字段以數(shù)組的方式列出了要繼承的對(duì)象,上面只繼承了com.apple.dt.unit.cocoaTouchApplicationBase,這個(gè)是和Xcode6一起的Empty工程類(lèi)似的。
而Signal View工程則繼承了com.apple.dt.unit.storyboardApplication"和com.apple.dt.unit.coreDataCocoaTouchApplication.
而
com.apple.dt.unit.storyboardApplication
又是繼承了上面的com.apple.dt.unit.cocoaTouchApplicationBase。 具體其定義了什么,可以對(duì)比著看下,在系統(tǒng)的工程模板位置,比如“Main.storyboard”是如何別加入工程的。
然后就可以在此基礎(chǔ)上開(kāi)始修改結(jié)構(gòu)了。主要涉及兩個(gè)位置
- OC的用
Objective-C字段: 每個(gè)Node是一個(gè)新工程中的具體物理文件位置,目錄自動(dòng)創(chuàng)建,如果沒(méi)有在后面的Definitions中指定,則吧路徑中的最后的的文件加入到工程的代碼跟目錄下。 - Definitions.Xxx : 這里Xxx就是上面的Node的值,其實(shí)一個(gè)字典類(lèi)型,主要有兩個(gè)鍵:
- Path: 模板文件(也就是要被拷貝的文件)所在工程模板中的位置
- Group: 新工程中,這個(gè)文件所在的Group
通過(guò)這樣的組合就可以確定模板工程目錄下的一個(gè)文件比如“Main.storyboard”在新工程的哪個(gè)位置(Node的值),以及在哪個(gè)Group(Definitions里面的Group)從而完成對(duì)目錄結(jié)構(gòu)的自定義
Demo示例

文件模板

占位符含義
| 占位符 | 意義 |
|---|---|
___FILENAME___ |
當(dāng)前的文件名 |
___PROJECTNAME___ |
當(dāng)前工程名,在創(chuàng)建工程時(shí)設(shè)置的 |
___FULLUSERNAME___ |
當(dāng)前登錄用戶(hù) |
___DATE___ |
當(dāng)前日期 ,格式為MM/DD/YY |
___FILEBASENAMEASIDENTIFIER___ |
不帶后綴的文件名 |
這里介紹下plist里面copy文件的目錄:

添加空文件夾
Definitions下
<dict>
<key>Path</key>
<string>Resources/</string>
<key>TargetIndices</key>
<array/>
</dict>
Nodes下
<string>Resources/</string>
自動(dòng)添加文件夾下所有文件夾以及文件
Definitions下
<key>Classes/</key>
<dict>
<key>Path</key>
<string>Classes/</string>
<key>TargetIndices</key>
<array/>
</dict>
Nodes下
<string>Classes/</string>
總結(jié)
由于Apple自己沒(méi)有公開(kāi)他們的工程目錄結(jié)構(gòu)定義(plist的格式說(shuō)明文檔),所以我們也只能根據(jù)Xcode已有的文件進(jìn)行逆向猜想,還有些諸如Target定義、info plist修改在文中都沒(méi)有涉及,這個(gè)過(guò)程還需要自己參考Xcode的模板,不斷的嘗試,才能得到自己想要的效果。
實(shí)踐
自定義工程模板
要的就是系統(tǒng)
SingleView工程模板效果

先研究了一下對(duì)應(yīng)的繼承結(jié)構(gòu)

實(shí)現(xiàn)步驟
- 找到
SingleView對(duì)應(yīng)的模板
找到
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Application,打開(kāi)TemplateInfo.plist

- 復(fù)制出來(lái)一份
TemplateInfo.plist,以此文件為基礎(chǔ),進(jìn)行改造

改造后

- 創(chuàng)建模板文件夾
文件夾放在
~/Library/Developer/Xcode/Templates/Project Templates/下

選擇自己創(chuàng)建的模板

- 模板工程
工程

多級(jí)Group支持
理論依據(jù)
其實(shí)是大家經(jīng)過(guò)無(wú)數(shù)次猜測(cè)嘗試這里
<key>Definitions</key>
<dict>
<key>Classes/SomeClass/SomeClass.m</key>
<dict>
<key>Group</key>
<array>
<string>Classes</string>
<string>SomeClass</string>
</array>
<key>Path</key>
<string>Classes/SomeClass/SomeClass.m</string>
</dict>
</dict>