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'

图片说明

copy Target

copy Target

info.plsit重命名

Manage Schemes

设置预编译宏

区分预编译宏,区分Target

一些注意点

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

后续

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

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

结尾


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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容