iOS多环境配置实践

前言

在移动客户端开发过程中,服务器一般都会提供多个环境的API接口,例如测试环境(TEST_ENV),发布环境(RELEASE_ENV),预发布环境(PRERELEASE_ENV)等,我们客户端在打包的时候需要在不同的阶段打不同环境的包,最简单的做法就是在代码里直接修改URL来切换不同的环境。但是这种做法太Low了,而且也不易于使用脚本自动打包。本文的主要内容就是介绍一种不修改代码达到配置不同环境的方法。

明确需求

在开始主要内容之前,先明确一下需求:

  1. 服务器有三个环境,测试环境(TEST_ENV),发布环境(RELEASE_ENV),预发布环境(PRERELEASE_ENV),要求要很方便的实现在三个不同环境之间自由切换
  2. 代码中大量使用了DEBUG宏,因此要求每个环境都应该区分DEBUG和RELEASE,即在任一环境下都可能需要打DEBUG包或RELEASE包

为此,我编写了一份测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#if TEST_ENV // 测试环境
#if DEBUG
NSLog(@"hello test env debug");
#else
NSLog(@"hello test env release");
#endif
#endif

#if RELEASE_ENV // 发布环境
#if DEBUG
NSLog(@"hello release env debug");
#else
NSLog(@"hello release env release");
#endif
#endif

#if PRERELEASE_ENV // 预发布环境
#if DEBUG
NSLog(@"hello pre-relase env debug");
#else
NSLog(@"hello pre-relase env release");
#endif
#endif

具体步骤

1. 为每一个环境创建一个Target

创建项目后,项目本身就会有一个Target(如果不了解Target的概念可以看一下这篇官方文档),我们可以把这个Target就作为某一个环境的Target,这里我们把它作为发布环境的Target,然后还需要创建测试环境和预发布环境的Target,方法如下:

在项目配置界面左侧,选中Target,点击右键,选择”Duplicate”,复制一个新的Target,如下图:

1

然后在弹出的菜单中点击”Duplicate Only”

2

这样就创建好了一个新的Target。新的Target的默认名称为”项目名称 copy”,即”Test1007 copy”,单击新创建的Target,修改Target名称为”Test1007_Test”,将这个Target作为测试环境的Target。

3

创建完Target后,XCode会自动为这个Target创建一个Scheme,为了方便起见,也将这个Scheme的名称修改为”Test1007_Test”,方法是在左上角点击”Manage Schemes…”,单机要修改名称的Scheme,即可修改Scheme的名称。

4

同样的方法,在创建一个名为”Test1007_Prerelease”的Target作为预发布环境的Target。

5

2. 配置环境变量

配置环境变量,就是添加TEST_ENV,RELEASE_ENV和PRERELEASE_ENV这三个宏,这一步在ObjectiveC下和Swift是不一样的,这里会分别讲解

ObjectiveC下配置环境变量

在项目配置界面选择发布环境的Target “Test1007”,点击Build Settings,找到Preprocessor Macros,在Debug和Release下都添加环境变量”RELEASE_ENV=1”,如图:

6

添加完成后结果如图:

7

这样就为发布环境添加好了”RELEASE_ENV”宏。

同样的方法,分别在Target “Test1007_Test”和”Test1007_Prerelease”添加TEST_ENV和PRERELEASE_ENV这两个宏。

Swift下配置环境变量

在项目配置界面选择发布环境的Target “Test1007”,点击Build Settings,找到Other Swift Flags,在Debug和Release下都添加环境变量”-D RELEASE_ENV”,如图:

8

添加完成后如图:

9

同样的方法,分别在Target “Test1007_Test”和”Test1007_Prerelease”下添加TEST_ENV和PRERELEASE_ENV这两个宏。

这样就完成了环境变量的配置。

3. 为不同环境的包配置不同的名称,BundleId和图标

其实到这一步就已经完成了不同环境的配置,要切换环境,只需要切换左上角的Scheme就可以了。为了更好的区分不同环境下的包,可以给每个环境配置不同的App名称,BundleId和App图标,方法如下:

在项目配置界面选中一个Target,通过修改Display Name和Bundle Identifier可以为不同环境的包设置不同的App名称和BundleId。

10

要设置不同的图标,需要在Build Settings里找到”Asset Calalog App Icon Set Name”,其默认值是AppIcon,可以为不同Target设置不同的Icon Set Name,然后在Assets.xcassets中添加对应的Image Set即可。

11

总结

本文是通过多个Target来实现多环境配置的,其实除了本文介绍的方法,还有其他方法可以实现多环境配置,具体可以参考这篇文章

有了多环境配置,就可以很方便的实现多环境自动打包,如果在加入持续集成系统(例如jenkins等),就可以非常优雅的打包。这个以后有时间会专门写一篇博客来介绍相关内容。

参考资料:
手把手教你给一个iOS app配置多个环境变量
iOS开发必备–环境变量配置(Debug & Release)
Xcode Project Configuration