iOS多环境配置的三种方案

6,368 阅读7分钟

第一种:多target形式

第一步,创建一个target

创建完成后,我们会发现多一个plist文件,这个plist就是对应新创建的target

第二步,修改target名为我们需要的名

我们把新taget改个名叫TargetDemo-Dev,因为新的target是一个全新的,所以需要改一个bundle ID,我们设置为com.baoyinxiaofei.TargetDemo-dev,同时他也有一个自己的plist配置文件,也就是上面一起生成的

修改target对应的icon

并且我们也可以为新的tager添加新的AppIcon,创建一个AppIcon

再到buildsetting里面将icon重新设置一下,这样两个target就展示不同的icon了

运行,我们发现两个target会生成两个app,

第三步、不同的target定义不同的宏的值

像我们平时如果需要在dev和release环境下执行不同的代码,我们一般是需要定义宏来进行区分,而我们项目默认有个宏Debug,其实是在下面自定义的

既然在这里,我们就可以自定义几个宏。例如我们可以自定义一个dev在debug环境下等于1,在release环境下等于0

我们可以测试一下发现在release和debug模式下运行打印的结果是不一样的,说明我们定义的宏起作用了。

在swift模式下,他有自己的方式,我们可以在other Flags里面创建一下变量在swift代码下使用,但是要在定义的变量前面加个-D

然后可以在swift类里面使用

假如我们项目有多环境,而debug和release不够我们使用,那我们只需要在不同的target下将宏定义成不同的值,即可更换不同的环境

但是这种方法比较繁琐,有不同plist文件,还需要再每个target下进行配置,下面我们看一下第二种比较简单的方法

第二种:多scheme方式

首先我们先了解一下三个名词的含义:

  • project:包含了项目所有的代码,资源文件,所有信息
  • target:指定代码和资源文件的具体构建方式
  • scheme:指定target的环境配置

第一步、添加Config

从上面方式看,我们看到其实不同的环境可以在不同Config下进行配置,target下面只有debug和release,假如我们可以多几种配置的话,就不用多个target了,所以我们给target添加几个Config,如下,我们可以到target里面多添加几个Config

我们添加一个叫beta的Config,然后到Edit scheme里面,可以看到build Configuration变成了三种模式

而我们target下的所有涉及到的配置地方也都变成三种模式:

第二步、添加scheme

但是像这种方式,我们每次都需要在Edit scheme里面修改scheme对应的配置环境,也比较麻烦,这个时候我们可以到manager scheme里面进行添加Scheme,这样就能在同一个target下,直接切换不同的scheme来进行环境的切换

我们再看一下项目的scheme,我们发现可以直接进行切换

第三步、将不同的scheme配置上对应的config

但是为了我们需要将不通的scheme配置上对于的configuration,这个是在Edit Scheme里面进行配置,如下图,我们需要在这里将不同的scheme配置好不同的configuration即可

第四步、在user-Defined中添加需要的变量

但是怎么使用呢,因为添加完configuration后,全局都会配置好,我们可以在Buidle Settiongs里面添加一个自定义的User-Defined

我们发现自定义的User-Defined里面也区分了三种configuration,我们可以在不同配置下定义不同的值

第五步、通过info.plist将定义的变量公开出去

因为在代码中我们拿不到配置的值,但是可以拿到plist的值,所以我们可以在plist里面将配置的变量公开出去,然后在代码中读取plist的内容,我们发现在不同的配置下读取的值是不同的

我们也可以通过这种方式让代码在一种环境下运行,在一种环境下不运行,同时也可以在可以配置的地方配置不同环境下的内容,例如图标

第三种、config配置文件的形式

当时这种方式虽然简洁很多,但是也需要进行很多地方配置,还有一种方式通过配置文件的形式来进行配置,例如我们经常使用的cocoapods会有下面两个配置文件:

这个地方在哪里用呢?,我们可以进入到project的configuration看到

这个是cocoapods创建的,那我们自己来创建一个看看是否能生效

第一步、创建config配置文件

我们创建两个config文件,注意的是这里文件名命名规则一般是遵守:文件夹名+ APP名 + 环境名,这个规则

第二步、将config文件配置到对应的configuration中

我们再将config文件配置到对应的环境中:

这里我们看到Target也可以选择配置文件,因为在Target的BuildSetting里面也有相应环境的配置,也可以通过config文件进行配置,下面红圈的是代表每个target的配置

第三步、在config文件中定义相应的变量

我们在两个config文件里面定义一个ConfigURLStr变量

然后在info.plist文件里面将该变量公开出去

再在代码中进行读取

我们就发现在release环境下和在dev环境下读取的值不一样

这样我们发现,通过config配置文件进行配置又比scheme方便一点,我们可以将多config配合多个scheme一起使用,这样会更灵活。

并且配置文件可以配置很多内容,包括buildSetting里面所有涉及到环境的选项,例如Other Linker Flags,我们在config配置上OTHER_LDFLAGS

编译一下,到buildsetting里面看下Other Linker Flags

我们发现debug里面配置上了framework,因为项目里面还没有该库,所以会报错

其实OTHER_LDFLAGS就是配置到链接器里面,本质上Config文件是key-value形式进行配置的,既然OTHER_LDFLAGS可以配置,那buildSetting里面所有涉及到环境变量的参数都能配置,还有很多参数可以配置,具体可以参考xcodebuildsettingsiOS使用 xcconfig配置文件的若干坑

从上我们看出,我们可以通过config文件对buildSetting进行配置,也就是可以将配置从buildSetting剥离开来,然后通过环境的不同进行配置

但是假如项目中有多个config文件怎么办呢,并且config和本身buildSetting里面的配置会不会产生冲突呢?例如我们在项目中使用cocoapods,然后pod install时候会发现cocoapods会提示这个警告: 翻译过滤就是cocoapods发现我们自己配置了config文件,所以它没有帮我们配置,但是需要我们将cocoapods生成的config文件导入到我们自定义的config文件里面,而导入方式就是通过include + 文件路径,导入后,我们在进行pod install,发现警告消除了

-** $(inherited) **:就是继承的意思,它会将导入的Config文件里相同变量的值拼接起来,但是在buildSetting里面只会显示inherited、里面本身所写的,还有配置的config文件里面的信息,但是实际上所有的信息都是导入的

我们做个试验,创建一个ConfigTarget.xcconfig配置文件,然后在里面配置上

在原来的config文件中添加一个配置,并导入新config的路径

在buildSetting里面添加一个"MJRefresh"

再编译一下,然后在代码中引入cocoapods导入的库并使用相应的类,发现没报错,说明导入成功