模板位置
- 全局位置
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates
- 用户自定义位置:
~/Library/Developer/Xcode/Templates/
这里我们一般操作用户自定义位置。
logo
logo必须名称为:TemplateIcon.tiff
,存放位置跟TemplateInfo.plist
同级,在*.xctemplate
的一级目录下,正方形即可4848,6464
工程模板
参数含义
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大部分键,详细介绍在 这里 。
工程模板定制
工程模板里面除了logo标签,最主要的就是要修改工程的结构,比如一些预定的Group,一些实现编写好的文件:
- 首先要修改下“Identifier”字段,以防冲突。
Xcode模板是支持继承的,或者叫做Import,这里
Ancestors
字段以数组的方式列出了要继承的对象,上面只继承了com.apple.dt.unit.cocoaTouchApplicationBase
,这个是和Xcode6一起的Empty工程类似的。
而Signal View
工程则继承了com.apple.dt.unit.storyboardApplication"
和com.apple.dt.unit.coreDataCocoaTouchApplication
.
而
com.apple.dt.unit.storyboardApplication
又是继承了上面的com.apple.dt.unit.cocoaTouchApplicationBase
。 具体其定义了什么,可以对比着看下,在系统的工程模板位置,比如“Main.storyboard”是如何别加入工程的。
然后就可以在此基础上开始修改结构了。主要涉及两个位置
- OC的用
Objective-C
字段: 每个Node是一个新工程中的具体物理文件位置,目录自动创建,如果没有在后面的Definitions中指定,则吧路径中的最后的的文件加入到工程的代码跟目录下。 - Definitions.Xxx : 这里Xxx就是上面的Node的值,其实一个字典类型,主要有两个键:
- Path: 模板文件(也就是要被拷贝的文件)所在工程模板中的位置
- Group: 新工程中,这个文件所在的Group
通过这样的组合就可以确定模板工程目录下的一个文件比如“Main.storyboard”在新工程的哪个位置(Node的值),以及在哪个Group(Definitions里面的Group)从而完成对目录结构的自定义
Demo示例
文件模板
占位符含义
占位符 | 意义 |
---|---|
___FILENAME___ |
当前的文件名 |
___PROJECTNAME___ |
当前工程名,在创建工程时设置的 |
___FULLUSERNAME___ |
当前登录用户 |
___DATE___ |
当前日期 ,格式为MM/DD/YY |
___FILEBASENAMEASIDENTIFIER___ |
不带后缀的文件名 |
这里介绍下plist里面copy文件的目录:
添加空文件夹
Definitions
下
<dict>
<key>Path</key>
<string>Resources/</string>
<key>TargetIndices</key>
<array/>
</dict>
Nodes
下
<string>Resources/</string>
自动添加文件夹下所有文件夹以及文件
Definitions
下
<key>Classes/</key>
<dict>
<key>Path</key>
<string>Classes/</string>
<key>TargetIndices</key>
<array/>
</dict>
Nodes
下
<string>Classes/</string>
总结
由于Apple自己没有公开他们的工程目录结构定义(plist的格式说明文档),所以我们也只能根据Xcode已有的文件进行逆向猜想,还有些诸如Target定义、info plist修改在文中都没有涉及,这个过程还需要自己参考Xcode的模板,不断的尝试,才能得到自己想要的效果。
实践
自定义工程模板
要的就是系统
SingleView
工程模板效果
先研究了一下对应的继承结构
实现步骤
- 找到
SingleView
对应的模板
找到
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/Application
,打开TemplateInfo.plist
- 复制出来一份
TemplateInfo.plist
,以此文件为基础,进行改造
改造后
- 创建模板文件夹
文件夹放在
~/Library/Developer/Xcode/Templates/Project Templates/
下
选择自己创建的模板
- 模板工程
工程
多级Group支持
理论依据
其实是大家经过无数次猜测尝试这里
<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>