iOS项目管理一: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本

iOS项目管理: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本

应用场景

  • 场景一:公司的一个项目,你经常需要在文件中修改一些类似于微信AppKey、友盟ID、测试\调试IP地址等等毫无技术含量,但是十分浪费时间的代码,给测试人员,客户等打包或者安装测试版本。等到正式发布release版本的时候,又是一通改。

    尤其是当你正在写代码的时候,你会对这样的行为感到异常烦躁。

  • 场景二:公司性质为OEM厂商,几个或者十几个客户的应用都是基于你自己公司的项目上,只不过是换了应用图标、启动图片、应用名称、Bundle ID、服务器IP地址、第三方分享或者检测框架的ID、info.plist配置文件部分信息或者极小部分代码的差异。

    然而每一次项目迭代或者上线,你都需要花费大量的时间为这些公司挨个手动替换这些图片文件资料,然后打包上传到AppStore.(当然如果你的公司如自己开发了替换还文件的自动化工具,然后把苹果上传应用接口自己搞了一遍,那么target就显得意义不是很大)。

  • 场景三:打开一些有名的第三方框架,是否发现在Xcode运行按钮左边选择不同的Scheme,运行得到的代码效果是不一样的,这是为什么呢?

Target介绍

官方文档中的介绍

A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product. Projects can contain one or more targets, each of which produces one product.

The instructions for building a product take the form of build settings and build phases, which you can examine and edit in the Xcode project editor. A target inherits the project build settings, but you can override any of the project settings by specifying different settings at the target level. There can be only one active target at a time; the Xcode scheme specifies the active target.

英文好的同学可能很快就知道了Target的妙用,在一个Xcode工程中,每个Target单独对应一个应用(A target defines a single product),因为我们可以在每个Target中单独设置属于这个Target的配置文件属性。

官方文档地址:《苹果官方文档-Xcode Target部分》

创建项目的不同Target

实现不同版本之间的差异化,主要就是下边几个步骤:

1、「右键Duplicate-Duplicate Only」复制单个Target 或者 新建Target,然后重新命名

2、修改Target对应生成的「xxx copy.plist」的工程配置文件的名字

3、Target对应「Build Settings」下配置Info.plist路径,或者直接在「General」中选择info.plist。

4、因为重新命名了Target的名字,所以需要在「Schemes」中选择「Manage Schemes」删除之前的schemes,然后重新添加当前所有的Target的Schemes。

这个时候有一个注意点,因为之后要用到Fastlane脚本进行自动化打包上传,所以这里需要勾选添加之后的schemes之后的「Shared」一项,保证脚本可以读取到Schemes权限。

5、配置预编译的宏,这个宏的作用就类似于我们之前在.pch之间用「#if DEBUG- #else- #endif」的DEBUG,我们切换选择项目的「Build Configuration」的时候,NSLog会不同显示。
配置的位置:在「Target-Preprocessor Macros」下的Debug和Release中。宏名字没有特殊要求, 格式有两种,一种为:XXXXXXXXX = 0或者"NEW_TARGET名字" ; 另一种为 xxxxxxxx

6、在类中添加匹配宏代码,区分Target,并且添加属于该Target的代码。方式有三种为:

第一种:

        //#ifdef target1的预编译宏名字
        #if target1的预编译宏名字
           // target1下的特有代码,比如说请求IP地址
        #else
           // 其他target下的特有代码,比如说请求IP地址
        #endif

第二种:

        // #ifdef xxxxxx
        #if xxxxxx == 0 或者 NEW_TARGET名字
         // 该target下的特有代码,比如说请求IP地址
        #elif xxxxxx == 1 或者 NEW_TARGET名字
         // 该target下的特有代码,比如说请求IP地址
        #else
         // 没找到匹配的预编译宏
        #endif

第三种:

        if (xxxxxx == 1 或者 NEW_TARGET名字) { 
          // 该target下的特有代码,比如说请求IP地址
        else 
          // 其他target下的特有代码,比如说请求IP地址

7、设置Target对应的应用图标和启动图片。这一步是针对OEM公司来说,如果你是自己公司只是自己的一个项目或者两个项目,只是用Target管理调试、测试、发布版本的话,启动图片用同一套,那么则不需要单独设置这一步了。

我们知道设置应用图标和和启动图片的有两种方式,一种是把图片加到「Assets.xcassets」中,另一种是直接把图片加到项目文件下。(需要也别注意下启动图标的尺寸,移步->《26- iOS项目基础 - 官方应用图标和启动图片的尺寸规范和相应的工程方法》)

我只测试了图片加到「Assets.xcassets」这种,在「Assets.xcassets」创建之后,修改或者不修改图片夹的名字后,直接在「Target-General」中选择对应的图片夹即可。

8、 如果你使用了Cocoapods的话,需要把新的Target添加到podfile文件中。有两种添加方式。
第一种:

    platform :ios, '8.0'
    workspace 'xxxxxxxxx'  
    // 添加第三方框架       
    target 'xxxxxx' do
    pod 'AFNetworking', '3.1.0'
    end
    // 添加的内容和上边的完全一样
    target 'xxxxx' do
    pod 'AFNetworking', '3.1.0'
    end

第二种:直接用link_with关联多个Target

    platform :ios, '8.0'  
    workspace 'xxxxxxxxx'  
    link_with 'target1', 'target2'  
    pod 'xxxxxx'

图片说明

iOS项目管理一: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本_第1张图片
copy Target

iOS项目管理一: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本_第2张图片
copy Target

info.plsit重命名

iOS项目管理一: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本_第3张图片
Manage Schemes

iOS项目管理一: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本_第4张图片
设置预编译宏

iOS项目管理一: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本_第5张图片
区分预编译宏,区分Target

一些注意点

  1. 如果你是新建项目,设置应用图标和启动图片,可能会遇到设置了之后不显示(白板)的问题,这个问题需要在我们设置步骤完成后,删除之前的APP,然后clean progect, 重新安装。具体移步-> 《iOS设置启动页,启动图片》
  2. 拖拽资源进工程的时候,需要勾选你需要的Target才可以共享资源。 当然,也可以拖拽到工程之后,单独选择资源共享。 利用这一点,也可以实现Target之间的差异性。

后续

针对OEM公司,比如我的公司,仅仅有Target来管理只是完成了第一步,因为还有同样繁琐没有任何技术含量的打包上传这一步骤等着我们,这里我打算尝试利用「Fastlane」来实现,关于Fastlane的一些基础介绍,可以查看我之前的文章。
《自动化工具Fastlane笔记一: 安装, 打包,上传(testFlight,app store)》

另外,结合多Target和Fastlane的一些自动化实践,我会写到第27篇文章中。

结尾


我的博客地址: http://www.lilongcnc.cc/


你可能感兴趣的:(iOS项目管理一: 利用Target来管理项目的调试、测试、发布等不同版本或者OEM版本)