前言
在项目开发过程中,我们通常会有多个项目环境,比如开发、测试、预发、正式环境等,而Xcode默认是只有debug和release两种环境的,并且切换起来不是那么方便。当需要开发打多个包的时候,一般常见做法就是直接代码里面修改环境变量,改完之后Archive一下就打包了。当然这种做法没问题,只不过不是很优雅很高效。为了更优雅的解决这个问题,我们可以利用xcode提供的 Targets、scheme以及xcconfig来解决这个问题。
目录
1、通过Targets来实现多环境配置
2、通过Build Configuration来实现多环境配置
3、通过xcconfig来实现多环境配置
一、通过Targets来实现多环境配置
1、复制Targets
新建Xcode时会自动创建一个默认的Target,我们如果要自己新增的话,可以通过复制的方式快捷创建第二个,复制会将已有的资源以及工程属性copy一份。
2、修改复制后Target的名称、生成的对应info.plist文件名称,修改target相关的info.plist文件配置
3、设置预编译宏
4、根据不同的配置来加载不同的文件或者变量
5、其他应用
给不同的target配置不同的Bundle Identifier以及图标和名称,来实现拥有相似功能的多app开发。共用文件时,用宏区!但有些文件就共用就不方便,如Info.plist文件。不共用文件,就设置选择属于自己的Target
二、通过Build Configuration来实现多环境
1、新建Build Configuration
通过Project里的info找到Configuration,然后选择添加新的Configuration。系统默认Debug和Release两种。这里我们需要选择是复制一个Debug还是Release。值得注意的是,Release默认是进行了脱符号处理,编译出来的包体积回比Debug模式要小一点,会屏蔽部分参数,具体可以通过BuildSetting里面的配置来查看区别。
2、新建Scheme
为新的Configuration新建一个编译Scheme,使用Manage Scheme添加Scheme
通过Edit scheme 来编辑各个Scheme对应的Build Configuration
以上多环境已经好啦,现在举个🌰:
我们通过User-Define来添加HOST_URL来作为请求的服务器地址,在不同的scheme环境下配置不同的地址
通过info.plist文件来暴露这个变量
<key>HOST_URL</key>
<string>${HOST_URL}</string>
最后在项目里通过切换不同的scheme就可以打印各环境下的HOST_URL啦
项目里的bundle id还有图标也可以通过这种方式来配置不同环境下的
三、通过xcconfig文件来实现多环境
多环境配置
1、新建一个配置目录,在目录里new两个xcconfig文件,注意的是这儿文件名命名规矩一般是遵循:文件夹名+ APP名 + 环境名
2、新建文件后我们在project里面设置一下
这里各环境对应的config文件已经配置好了,现在我们在文件里添加变量,并通过info.plist文件暴露出该变量
<key>HOST_URL</key>
<string>${HOST_URL}</string>
通过info.plist文件访问这个变量的值,可以看到不同环境下变量的值是不一样的
注意:
在xcconfig文件里的的双斜线会被认为是注释,我们需要对服务器地址的双斜线进行处理一下
我们一般对动态库配置是通过build setting中的Other Linker Flags来处理的,在xcconfig文件中只需添加OTHER_LDFLAGS 就可以对Other Linker Flags添加动态库
其实OTHER_LDFLAGS便是装备到链接器里边,本质上Config文件是key-value方法进行装备的,已然OTHER_LDFLAGS能够装备,那buildSetting里边悉数涉及到环境变量的参数都能装备,还有许多参数能够装备,详细能够查看xcodebuildsettings这个网站。
xcconfig冲突
如果我们在项目中运用cocoapods,项目会帮我们生成一组xcconfig文件,然后pod install时会发现cocoapods会报错这个警告:
从警告可以看出cocoapods发现咱们自己装备了config文件,所以它没有帮咱们装备。我们可以将cocoapods生成的config文件导入到咱们自界说的config文件里边,而导入方法便是经过include + 文件途径,导入后,咱们在进行pod install,发现警告消除了
当两个config文件都有同一个配置的话会发成冲突,只生成我们配置文件的变量,这个时候我们可以通过$(inherited)处理
$(inherited) :是继承的意思,它会将导入的Config文件里相同变量的值拼接起来,可是在buildSetting里边只会显现$(inherited)、里边本身所写的,还有装备的config文件里边的信息,实际上所有的信息都是导入的