`
janedoneway
  • 浏览: 582009 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

XCode工程内多Targets教程

 
阅读更多

From: 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的target 

分享到:
评论

相关推荐

    Xcode的Targets多版本构建

    其中一个关键特性就是Targets,这个概念在Xcode中扮演着多版本构建的核心角色。本文将深入探讨如何利用Xcode的Targets实现不同版本的项目构建,以及这一功能在实际开发中的应用。 首先,我们需要理解什么是Xcode的...

    理解Xcode工程(中文版)

    【Xcode工程理解】\n\nXcode是Apple官方推出的集成开发环境(IDE),主要用于iOS和macOS应用的开发。它包含了编写、构建、测试和调试应用所需的所有工具,是Apple平台开发者的首选工具。本文将深入探讨Xcode工程的...

    使用代码为 Xcode 工程添加文件1

    generator.rb 脚本是一个 Ruby 脚本,用于生成 Xcode 工程中的文件,如 targets、配置文件、源代码文件等。我们可以使用 Ruby generator.rb 脚本来生成新的文件,并将其添加到 Xcode 工程中。 在 Xcode 工程中,...

    Unity导出的Xcode工程合并到现有的Xcode项目实现AR流程及合并中遇到的各种问题解决方法,附demo下载地址

    ### Unity导出Xcode工程与现有Xcode项目整合:实现AR功能及常见问题解决 #### 一、背景介绍 在跨平台游戏开发中,Unity是一个非常流行的开发工具,它能够帮助开发者快速创建出高质量的游戏,并支持多种平台的发布...

    Unity导出xcode自动配置工具1

    为了保持原始工程的完整性,建议复制一份Xcode工程副本并在此副本上进行修改和打包。所有这些操作可以通过配置渠道下的XcodeSetting.json文件完成。如果XcodeSetting.json的功能不能满足特定需求,可以直接修改...

    Xcode的Targets进行多版本构建

    本篇文章将深入探讨如何利用Xcode的Targets实现不同版本的应用程序构建。 首先,我们需要理解什么是Target。在Xcode中,Target是一个构建设置的集合,它定义了如何编译、链接以及打包一个项目中的代码和资源。每个...

    Xcode 4 快速入门教程:[1] Xcode 4 Project Setup

    Xcode 4 快速入门教程:[1] Xcode 4 Project Setup 视频

    Xcode添加空工程模板(内含步骤 模板)

    本篇文章将详细介绍如何在Xcode中添加空工程模板,以及如何自定义这个模板,以适应不同的开发需求。 首先,我们需要了解Xcode工程模板的工作原理。Xcode的工程模板是一组文件,它们定义了新工程的基本结构、文件...

    使用代码为 Xcode 工程添加文件 - 推酷1

    这篇内容将详细讲解如何使用代码来为Xcode工程添加文件,并介绍一些与Xcode项目管理相关的工具和技术。 首先,要理解Xcode项目的基本结构,其中PBXBuildFile部分是Xcode项目文件(pbxproj)的一部分,用于记录项目...

    Xcode_入门经典教程

    本经典教程基于Xcode 3.2版本,它已经稳定运行了十年左右的时间。苹果在2010年中期发布了Xcode 4的首个开发者预览版,这一新版本带来了颠覆性的变化。Xcode 4将Xcode与Interface Builder整合进单一窗口,彻底摒弃了...

    全新版本全新工具-进击Apple IOS 13开发实战 SwiftUI 5.1+Xcode11 SwiftUI实战教程

    全新版本全新工具-进击Apple IOS 13的SwiftUI开发实战,使用最新的Mac OS X集成开发工具Xcode11进行SwiftUI构建用户界面,让同学们最近的距离接触IOS与用户界面开发。课程分为了SwiftUI开发的基础部分与进阶部分,...

    Learning Xcode 8 pdf 0分

    - **项目目标(Project targets)**:定义项目的构建配置。 - **General标签**:基本项目设置,如产品名称、团队等。 - **Capabilities标签**:添加特定功能,如推送通知、iCloud支持等。 - **Info标签**:包含应用的...

    使用Xcode的Targets进行多版本构建

    在iOS和macOS开发中,Xcode的Targets是构建系统的核心组成部分,它允许开发者为不同的平台、设备或项目目标创建多个版本的同一应用程序。通过合理利用Targets,开发者可以有效地管理和控制项目的编译、链接和打包...

    Xcode6中增加空工程模板

    Xcode6是苹果公司推出的一个版本,然而,与之前的版本相比,它在新建工程时确实移除了“空工程模板”这一选项,这对于某些开发者来说可能带来了不便。本文将详细解释如何在Xcode6中添加这个空工程模板,以便于那些...

    将Three20开源库导入Xcode工程项目全过程

    7. 在工程的Targets配置页,Build Settings部分,设置Header Search Paths,添加Three20库的头文件搜索路径,通常为`$(SRCROOT)/Three20/src`,确保使用双引号括起来。 8. 在Other Linker Flags中添加`-ObjC -all_...

    Xcode 创建空工程

    xcode6以后的版本都不支持创建空工程,每次手动改成空工程,效率比较低。现在有个插件下载下来直接放到路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/...

    Xcode中文实用教程

    本教程将深入浅出地介绍Xcode的各个方面,帮助中文用户掌握其核心功能和实用技巧。 1. **Xcode界面介绍** Xcode的主界面由多个关键部分组成:导航区、编辑区、工具区和控制区。导航区包括项目导航器、源代码文件...

    xCode 单元测试指南

    - **配置Xcode工程**:详细介绍如何配置Xcode工程以支持单元测试。 - **依赖VS独立**:讨论依赖型和独立型单元测试目标的区别及其优缺点。 - **创建测试目标**:指导如何在Xcode中创建单元测试目标。 - **创建依赖型...

    mPaas的ruby命令行工具

    获取 Xcode 工程的 targets 信息 mpaas project import 向工程导入云端配置数据 mpaas project edit 增删 mPaaS 模块依赖 mpaas project upgrade 升级 mPaaS 模块依赖 SDK 管理命令 mpaas sdk version 显示最新...

    RecordingTranscoding Xcode iOS 工程

    在iOS开发中,"RecordingTranscoding Xcode iOS 工程"是一个专为音频处理设计的项目,它涵盖了音频录制、转码以及播放的功能。这个工程是开发者为了方便iOS应用实现复杂音频操作而创建的一个示例或者框架。接下来,...

Global site tag (gtag.js) - Google Analytics