iOS强化 : Xcode多环境配置

前言

这里会介绍三种多环境的配置方法,开发需要根究自己的需求进行灵活使用。

Xcode常见名词

  • Project :包含了项目所有的代码,资源文件,所有信息。
  • Target :对指定代码和资源文件的具体构建方式。
  • Scheme :对指定Target的环境配置。
  • WorkSpace : 多个Project的合集环境

其中真正发挥作用的打工人: Target

首先我们来看一个熟悉的东西:


通多上面修改Build Configuration的方式来切换DebugRelease的开发环境,是最基本的操作。但是很多大型的项目,并不能满足我们的开发需求, 比如说在早期一份代码可以上架多套不同UI的app,为了提高开发效率,这个时候就可以进行多渠道,多target的构建方式。 在这里介绍三种多环境的配置方式。

方式一:多个target配置

target: 在编译时就是给编译插入参数。添加配置条件信息。

配置步骤:

1. 制作一个副本

之后发现增加了一个Target和一个Info.plist文件,同时也会多一个Scheme。这里没有产生任何代码,只是多了一个打工人。

2. 修改infoplist和scheme文件名称

3. Target中预定义宏的的设置

使用:

 if(DEV){
        NSLog(@"DEV");
    }else{
        NSLog(@"");
    }

但是切换到原始target下的时候,就会报错



同理我们应该在原始target下也进行配置即可。


  • 考虑到swift混编的情况下

我们在上面工程的基础上看下混编要怎么设置(注意,视情况做出调整):
这里要注意,在添加一定要在前面加一个-

这里我们发现其缺点:

    1. 关于target的配置很繁琐,不方便。
    1. 还需要配置infoplist文件

方式二:多个Scheme配置

Scheme :就是为了控制环境变量

我们可以看见:


这里有target 和 release两种模式。 我们能否添加第三种模式呢?当然是可以的。

这样我们可以选择不同的 Scheme 去设置编译的环境。比如说debug的Scheme情况下就选择编译debug 模式的。 release的Scheme情况下就选择编译release 模式的等等。

举个例子:

不同的Scheme对应不同的AppIcon:
首先我们要在Assets.xcassets再添加一个AppIcon:

  • 接着我们可以在targetBuild Settings里面设置不同的configuration对应不同的AppIcon

  • 我们还可以针对不同Scheme设置不同的App Name
    TargetBuild Settings里面添加自定义的字段,如下:

假设我们现在就将字段名定义为BUNDLEDISPLAY_NAME,然后Debug模式下就叫DebugRelease模式下就叫Release
接着我们要在Info.plist文件中替换Bundle name:

缺点:此时同样的,我们还是需要在Target里面修改很多东西,这样的还难免会遗漏一些东西,改起来也不是特别的方便。

那么我们能不能通过一个文件来 控制build setting里面的内容呢?这样我们就不需要找来找去,需要改就直接集合在一起改就好了呢?当然是可以的,接下来看第三种方式。

方式三:利用xcconfig文件,结合自定义的Scheme

其实我们在进行cocopods开发的时候,会自动生成xcconfig文件,如下:

其实这个xcconfig文件类似于plist文件,就是一个Key-Value的集合,其对应的就是Target中的设置:

因此我们可以自定义xcconfig文件。步骤如下:

1. 添加文件

⚠️ 注意:xcconfig文件的命名规则是:<文件夹名称-APP名称.对应的configuration>如下:


不使用cocopods 如下:
2. 配置文件

运行即可。

  • 实际的开发中,你面对的可能不只是Debug& Release环境,可能有本地测试服正式服等等。因此个人建议,用不同的Scheme区分开,是比较高效的处理方式。
  • 其实有个更有意思的事情: XConfig文件 又叫Xcode Configurations ,我们在Build Settings 里面的很多配置都可以通过这个文件通过Key-Value的方式来控制。

举例:在使用静态库,动态库的时候我们都会需要配置

  • 我们在Config文件里写入的时候,如下编译的时候Build Settings 里面会自动生成配置。 那么其它的配置信息也可以类似配置。
  • Config文件里 OTHER_LDFLAGS是什么呢?其实就是一些key的缩写,可以查到Target的各个字段对应的缩写:Xcode Build Settings

xcconfig文件冲突

冲突 1:

实际开发中,我们会使用Cocopods来管理我们的第三方库,Cocopods也会给我们生成一些xcconfig文件(这里注意⚠️ :每次podCocopods都会从新生成xcconfig文件,所以不要在Cocopods生成的xcconfig文件中做修改)

那么这个时候,就有一个问题,我们针对configuration到底要选哪一个xcconfig文件呢?当然是我们自定义的xcconfig

这样有衍生出另一问题,那么pod生成的xcconfig我们该怎么处理,如果不添加,则pod install就会出问题,如果是之前pod好的工程,那么pod中针对Target的一些设置又该怎么办?
其实很简单,我们只需要在自定义xcconfig文件中引入pod生成的xcconfig文件就可以了,如下:

#include "Pods/Target Support Files/Pods-test1/Pods-test1.debug.xcconfig"
冲突 2:

如果自定义xcconfigpod生成的xcconfig文件,对同一个字段进行了修改,那Xcode会用哪个文件中的配置呢?

答案是:自定义xcconfig,其实大家想一下就明白了,自定义的 引用 pod生成的,然后Xcode再引用自定义的

那么像这种问题我们该怎么解决呢?
这里我们先给出答案:使用$(inherited),可以理解为继承。

下面我们看一下具体的使用场景:
首先我们在自定义的xcconfig文件中添加

OTHER_LDFLAGS = -framework "SDWebImage"

同时我们也podAFNetworking
此时我们会发现,在TargetBuild Settings-Other Link Flags路面只有SDWebImage,如下:

这也就意味着,我们引入的第三方库的链接是失败的。
这时候,我们就可以在等号加上-framework "SDWebImage"

OTHER_LDFLAGS = $(inherited) -framework "SDWebImage"


这里跟大家分享一下:问题 2 的解决办法,其实就在pod自己生成的xcconfig里面,如果有兴趣可以先不自定义xcconfig,使用pod引入一个三方库,看看pod自动生成的xcconfig是怎么写的,然后对应的Target里面的设置又有了哪些变化。

五、xcconfig配置技巧

  • 1、在Build Settings里面自定义了URL字段,在xcconfig如何配置//的问题
    如果我们直接在xcconfig文件中写上对应的URL会是被识别为注释符号
    我们可以先定义一个/的变量:
A = /
HOST_URL = ${A}/192.168.1.1

其中${A}$(A) 是等价的。

  • 2、比如说我们现在要配置 OTHER_LDFLAGS,按照上面讲的我们是这样写的:
OTHER_LDFLAGS =  -framework "SDWebImage"

其实我们还可以添加附加条件,比如:指定特定的开发环境机型架构等等,如下:

OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] =  -framework "SDWebImage"

此时OTHER_LDFLAGS引入SDWebImage只会在Debug模式下,运行模拟器并且对应的执行架构为x86_64的时候,才会执行。

优先级(由高到低):

  1. 手动配置Target Build Settings
  2. Target中配置的xcconfig文件
  3. 手动配置Project Build Settings
  4. Project中配置的xcconfig文件

总结:

对于多环境、多项目的配置选择xcconfig的方式最为高效。

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

推荐阅读更多精彩内容