欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Xcode -Target , PROJECT 区别 - Xcode

程序员文章站 2024-03-15 13:57:47
...

写在前面 : 从项目中遇到一些问题, 简单总结一下.来个图感受下

Xcode -Target , PROJECT 区别 - Xcode
图1 : 一份代码, 六份Tatgets

------简单介绍一下------

  1. project就是一个项目,或者说工程,一个project可以对应多个target(你看看上面的图)
  2. targets之间完全没有关系。但target和project有关系,target的setting会从project settings中继承一部分(看图2)
    Xcode -Target , PROJECT 区别 - Xcode
    图2 : project有BuildSetting
    Xcode -Target , PROJECT 区别 - Xcode
    图2 : Targets , 这里的Setting会继承Project的
  3. Target指定了哪些内容? 3.1. Build Phases Target Dependencies Target依赖,某些Target可能依赖某个Target输出的值,这里设置依赖 Copy Bundle Resources 是指生成的product的.app内将包含哪些资源文件 Compile Sources 是指将有哪些源代码被编译 Link Binary With Libraries 是指编译过程中会引用哪些库文件
    Xcode -Target , PROJECT 区别 - Xcode
    图3 : Build Phases
    3.2. Info 这个Info.plist文件内定义了一个iPhone项目的很多关键性内容, 比如程序名称, 最终生成product的全局唯一id等等.每一个Target都能设置不同的

------如何创建一个Targets?------

  1. 创建Target版本 (cimmand + D)

    Xcode -Target , PROJECT 区别 - Xcode
    创建版本
  2. Xcode 会询问你这个 target 是不是针对于 iPad 开发的。 “Duplicate Only” 的意思很明显了吧。 提示:如果你的项目支持通用设置,则 Xcode 不会提示上面的消息。

    Xcode -Target , PROJECT 区别 - Xcode
    询问是否支持ipad
  3. 现在我们有了一个名为 DY Copy, 的新 target 和构建 scheme 。我已经重命名为DYTest了。接下来,来到 “Manage Schemes…”,改名 !
    Xcode -Target , PROJECT 区别 - Xcode
    Xcode -Target , PROJECT 区别 - Xcode
    Manage Schemes
  4. 理论上我们应该区分开发版跟生产版的应用,所以我们应该提供不同的应用图标和启动界面。这可以使测试更加清楚他们现在使用的版本,并且可以防止我们提交开发版本的应用到商店中。 :grinning: 选中 Assets.xcassets 然后添加新的 App 图标。选择 icon > App Icons & Launch Images > New iOS App Icon. 将新图标命名为 “AppIcon-Test” 并且添加你需要的图片。然后你肯定要配置一下.
    Xcode -Target , PROJECT 区别 - Xcode
    添加图片
    Xcode -Target , PROJECT 区别 - Xcode
    配置
  5. 配置一下项目(Info, Build Setting等) 现在回到项目设置,选择开发版的 target 然后修改 bundle ID。可以简单地在原来的 ID 上添加一个 “Test” 后缀。 Xcode 会自动为新的 target 创建一个 plist 文件(一般命名为 todo copy-Info.plist)。可以在项目的根目录下找到这个文件。将 “copy” 修改为 “Test”,然后将它放到原来的 plist 文件下方。这样可以更方便我们对文件进行操作。
    Xcode -Target , PROJECT 区别 - Xcode
    自动生成的Plist
  6. 现在选择开发版 target 下的 “Build Settings”,滚动到 “Packaging”,然后修改指定 plist 文件为开发版 plist(即刚刚的 todo Test.plist)
    Xcode -Target , PROJECT 区别 - Xcode
  7. (重要) 最后,为生产版和开发版 target 同时设置一个预处理宏和编译器标志。这样在之后的开发中我们就可以在代码中使用这个标识来检测当前运行的应用是哪个版本。 对于 Objective-C 项目,来到 Building Settings,滚动到 Apple LLVM 7.0 - Preprocessing 。展开 Preprocessor Macros 并且为 DebugRelease 添加一个变量。对于开发版 target(即 todo Test),设置变量的值为DEVELOPMENT=1 (校对注:等号两边不能有空格)。相对地,设置开发版 target 的值为 DEVELOPMENT=0。

    Xcode -Target , PROJECT 区别 - Xcode
    其他版本同理
  8. 在开发中,就可以利用这个宏了,例如 :

    #if DEVELOPMENT
    // 这是正式版咯
    #else
    // 这是开发版咯
    #endif

这里补充一种方法 ,
Xcode中可以利用Compiler Flags来设置宏
可以通过设置Compiler Flags来定义宏,然后就可以在代码中使用这些宏,来进行条件编译的操作。有三种方式设置:

// 在Target>Build Setting>Custom Compiler Flags>Other C Flags
OTHER_CFLAGS (Other C Flags)

// 在Target>Build Setting> Preprocessing > Preprocessor Macros
GCC_PREPROCESSOR_DEFINITIONS (Preprocessor Macros)

// 在Target>Build Setting> Packaging > Info.plist Preprocessor Definitions
INFOPLIST_PREPROCESSOR_DEFINITIONS (Info.plist Preprocessor Definitions)
Xcode -Target , PROJECT 区别 - Xcode
设置了LIFEORIJECT


就像上图 , 某个Target中设置了,这个宏, 后面我就用这个宏来判断,究竟是哪个Target了.

// 同属于生产环境
#ifdef LIFEPROJECT
    // 这里属于life的
#else
    //  这里属于不是life的
#endif

------一些注意事项 : ------

  1. 当为项目添加新文件时,不要忘记同时勾选多个 target 来保持各个 target 中的代码一致。

    Xcode -Target , PROJECT 区别 - Xcode
  2. 如果你的项目中使用了 Cocoapods,不要忘记在 podfile 中增加新的 target。我们可以使用 link_with
    来指定多个 target。可以在 Cocoapods 文档中找到更详细的内容 。现在 Podfile 看起来应该是这样的

    xcodeproj '/Volumes/MYGIT/DY/DY/DY.xcodeproj'  
    platform :ios , ‘7.0’  
    workspace 'DY'  // 这个
    link_with 'DY', 'DYTest'  // 这个
    pod ‘AFNetworking’, ‘> 3.0’
    pod 'Masonry', '0.5.3'
    pod 'RDVTabBarController', '~> 1.1.9'
    pod 'MBProgressHUD', '~> 0.9.2'
    pod 'MJExtension', '~> 3.0.10'
    pod 'MJRefresh', '~> 3.1.0'
    pod 'SDWebImage', '~> 3.7.5'
  3. 如果使用了持续集成系统,比如 Travis CIJenkins ,不要忘了每个 target 的构建和交付都要配置。


链接:http://www.jianshu.com/p/e304247ede59
來源:简书




        本文地址:http://blog.csdn.net/zhaoyabei/article/details/45396913   转载注明出处


Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode


 可以看到已达到想要的效果,总的来说,选中一个Target后可以更改与之相关的各种属性,如Info、Build Setting、Build Phases等,来生成不同的app。

本文中提到链接:

苹果官方的解释

可以参考唐巧的一篇文章   


        本文地址:http://blog.csdn.net/zhaoyabei/article/details/45396913   转载注明出处


Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode


 可以看到已达到想要的效果,总的来说,选中一个Target后可以更改与之相关的各种属性,如Info、Build Setting、Build Phases等,来生成不同的app。

本文中提到链接:

苹果官方的解释

可以参考唐巧的一篇文章   


Target简介 
多个Target的使用场景 
Target的使用


使用Xcode创建工程时默认的设备是iPhone,并且默认选中Include Unit Tests(单元测试)和Include UI Tests(UI测试), 创建成功后可看到四个文件夹 (工程名字、TestTests、TestUITests、Products),在开发中一般都是关注在工程名字下的文件家,对于其他文件夹一直没有在意过,现就研究一下

Xcode -Target , PROJECT 区别 - Xcode

工程目录:四个文件夹(3个Target文件夹:(工程名字、单元测试、UI测试)、Products),从下面第二张图中可以得知单元测试和UI测试都在TARGETS下面,那他们也是Target,从图一可以得知前三个文件夹,每个文件夹对应一个Target,同时也对应一个Product的(Products目录下有三个文件),每个Target文件夹都是真实文件夹并且每个下面都有一个Info.plist,这说明他们可以独立管理

Xcode -Target , PROJECT 区别 - Xcode———–Xcode -Target , PROJECT 区别 - Xcode

在工程中,一个Target对应一个Product, 一个Project包含多个Target,Target中的Build Settings会继承自Project的Build Settings

在中国开发一般都很少进行单元测试,对于iOS来说我在学习过程中从来都没有接触过单元测试,一次都没有接触过,都是关注最上面那个Target文件夹。

多个Target的使用场景

  1. 通常创建工程的时候默认的Devices是iPhone,如果公司刚开始只开发了iPhone设备上的App,后来想开发iPad上的App,而iPad上的App和iPhone上的App功能界面有很多相似之处,那么如何开发iPad上的App呢?复制之前的App对应的Target命名为iPad,然后在iPad对应的Target上进行开发
  2. 添加其他工程到当前工程
  3. 添加静态库
  4. 版本控制(最新版本、测试版本、生产版本): 比如为了防止测试人员混淆App是测试版本还是生产版本,可以使用不同的App的名字和不同的App Icon加以区分

Target的具体使用

  1. 通过复制某个Target来创建一个新的Target, 选中第一个Target,然后右键,Duplicate,弹出一个框询问你是只是仅仅复制,还是复制并转成iPad,这里选择的是Duplicate Only,复制成功后可以看到在TARGETS中多了一个 Test copy, 在Products文件夹中也多了一个Test copy.app, 工程根目录下多了一个Test copy-Info.plist文件 
    Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

2、看到Target的名字带有copy不爽,给她重命名,双击即可重命名,重命名后可以看到Products文件下对应的Test copy.app 的名字随着改变,继续重命名Test copy-info.plist文件,这还没有完,选择Product—>Scheme—>Manage Schemes,双击选中的Scheme,修改Scheme对应的名字,修改新的Target对应的Build Settings—> Packaging—>Info.olist File 对应的新的plist名字 
Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

3、修改每个Target对一个的plist文件:Info.plist(Test), Test2-Info.plist(Test2) 中的Bundle display name(没有就添加) 和 Bundle identifier

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

4、分别选中每个Scheme,然后运行,此示例完成了同一个工程,打出了两个App,名字不一样 
Xcode -Target , PROJECT 区别 - Xcode

5、同理:也可以对App Icon和Launch Image 做不同处理 
选中Assets.xcassets–>右键–> App Icons & Launch Images —> New iOS App Icon 并重命名为AppIcon-Test2, 然后分别为AppIcon和AppIcon-Test2添加对应的图标

Xcode -Target , PROJECT 区别 - Xcode 
Xcode -Target , PROJECT 区别 - Xcode

修改每个Target中的Build Settings中的App Icon 对应的name 
Xcode -Target , PROJECT 区别 - Xcode

运行效果如图: 
Xcode -Target , PROJECT 区别 - Xcode

6、同理启动图也是一样操作

7、当添加新的Target的时候,在创建类或其他文件时,在Targets中会多出对应的Target,注意你要选中放到那个Target中,还是都放 
Xcode -Target , PROJECT 区别 - Xcode

如果使用了Cocoapods,在Podfile中需要指明target,可以使用link_with同时指定多个Target, 例如 link_with ‘TargetName’, ‘TargetName2’


        本文地址:http://blog.csdn.net/zhaoyabei/article/details/45396913   转载注明出处


Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode

Xcode -Target , PROJECT 区别 - Xcode


 可以看到已达到想要的效果,总的来说,选中一个Target后可以更改与之相关的各种属性,如Info、Build Setting、Build Phases等,来生成不同的app。

本文中提到链接:

苹果官方的解释

可以参考唐巧的一篇文章