[转载]XCode工程内多Targets教程

做者  透明de面具

原帖地址  http://www.cocoachina.com/bbs/read.php?tid-10972-fpage-0-toread--page-1.html

    相信不少人都注意到XCode中, 有个Target的概念. 这在不少地方都有所体现, 好比打开一个工程后, 左侧的列表中有Targets一项, 而在工程界面的顶部菜单中, project里面也有多个涉及到Target的项目, 那么这个Target究竟是什么呢? 

    Apple 的人是这样说的:“ Targets that define the products to build. A target organizes the files and instructions needed to build a product into a sequence of build actions that can be taken.”
    简单的理解的话, 能够认为一个target对应一个新的product(基于同一份代码的状况下). 但都一份代码了, 弄个新product作啥呢? 折腾这个有意思么?
    其实这不是单纯的瞎折腾, 虽然代码是同一份, 但编译设置(好比编译条件), 以及包含的资源文件却能够有很大的差异. 因而即便同一份代码, 产出的product也可能大不相同.
    咱们来举几个典型的应用多Targets的状况吧, 好比完整版和lite版; 好比同一个游戏的20关, 30关, 50关版; 再或者好比同一个游戏换些资源和名字就当新游戏卖的(喂喂, 你在教些什么...)

Targets之间, 什么相同, 什么不一样!

    既然是利用同一份代码产出不一样的product, 那么到底不一样Target之间存在着什么样的差别呢?
    要解释这个问题, 咱们就要来看看一个Target指定了哪些内容.

    从XCode左侧的列表中, 咱们能够看到一个Target包含了Copy Bundle Resources, Compile Sources, Link Binary With Libraries. 其中
        Copy Bundle Resources 是指生成的product的.app内将包含哪些资源文件
        Compile Sources 是指将有哪些源代码被编译
        Link Binary With Libraries 是指编译过程当中会引用哪些库文件

    经过Copy Bundle Resources中内容的不一样设置, 咱们可让不一样的product包含不一样的资源, 包括程序的主图标等, 而不是把XCode的工程中列出的资源一股脑的包含进去.
    而这还不是一个target所指定的所有内容. 每一个target可使用一个独立, 不一样的Info.plist文件.  
    咱们都知道, 这个Info.plist文件内定义了一个iPhone项目的不少关键性内容, 好比程序名称, 最终生成product的全局惟一id等等.
    
    并且不一样的target还能够定义完整的差别化的编译设置, 从简单的调整优化选项, 到增长条件编译所使用的编译条件, 以致于所使用的base SDK均可以差别化指定.

建立第二个Target!
    为何是第二个? 由于第一个就是建立好工程后的默认Target呀! (废话这么多, 拖走...)

    建立target有多种方法, 咱们能够从现有的target上复制出一份, 而后略加改动, 也能够彻底新建一个target出来. 但其实说穿了, 两个方法大同小异
    首先咱们来看看利用复制的方法建立target

    利用复制建立target
    咱们在XCode左侧的列表中, 展开 Targets 项, 在现有的target上, 右键选择 "Duplicate", 或者选中现有target后, 在顶部菜单的Edit内选择"Duplicate"也能够.
    此时咱们就获得了一个新的target, 而在Resource里面也会获得一个 xxxx copy.plist. 这个新的target与原有的target是彻底一致的, 余下的就是一些差别化的修改, 这个咱们后面再说

    建立全新的target
    相似复制的方法, 咱们能够在左侧的列表中不少地方按下右键菜单, 均可以看到Add中会有"New Target..."一项, 而在工程顶部菜单的Project内, 也能够看到这个"New Target..."的身影.
    点击后, 首先会让你选择target的类型, 既然我一直所指的都是程序自己, 那么天然选择Application了(至于其余的嘛, 有兴趣的本身研究吧, 好比咱们能够把程序中的部分提取成一个Static Library).
    Next后, 会让你输入一个新的Target的名字, 而不像复制的方法中, 默认生成 xxxxx copy这样的target名.
    可是这样生成出的Target几乎是空的. Copy Bundle Resources, Compile Sources, Link Binary With Libraries里面都没有任何内容. 编译设置也是彻底原始的状态.
    能够经过拖拽内容到这些target的设置中, 以及调整编译选项来完成Target的配置.


Target中部份内容的修改方法!
    其实这段的部份内容, 在非多Targets的工程中也可能会用获得.
    因为修改基本都是在工程/编译设置中完成, 所以没有特殊状况, 就再也不声明了, 打开target对应的工程/编译设置的方法能够采用在该target上右键, 选择get info来作到.

    生成的product名称的修改: Packing段内的Product Name一项

    Info.plist文件名: Packing段内的Info.plist File一项, 好比复制出来的target以为那个xxxxx copy.plist太傻就能够在这里改

    条 件编译: 增长一个User-Defined Setting(Target "xxxx" Info的build页的左下角那个齿轮中能够看到这个内容), 在Other C Flag里面填入, 好比要定义一个叫作LITE_VERSION的define值, 咱们能够写上 "-DLITE_VERSION" 或 "-DLITE_VERSION=1". 那么在程序中就能够用
    #if defined(LITE_VERSION)
    #else
    #endif 这样的条件编译来部分差别化代码了

    也许有些朋友记得我在代码区贴过的检测破解版的代码, 其中有一种检测方法就是看info.plist是文本仍是二进制的, 那么咱们可否建议一个模拟破解的target, 直接生成文本的info.plist以便测试呢?
    固然能够, 在packing段内, 有一项叫"Info.plist Output Encoding", 默认值是Binary, 咱们只要选成xml, 那么生成出的product.app内的info.plist就直接是文本样式的了.


    另 外, 向Copy Bundle Resources, Compile Sources, Link Binary With Libraries内添加/删除文件, 能够在要改动的文件上, 选择get info, 而且切换到Target页, 勾选要引用这个文件的target便可. 好比icon.png能够指定给默认target, 而icon_lite.png指定给lite verion的targetphp

相关文章
相关标签/搜索