Fork me on GitHub

App配置多环境变量以及马甲包制作

App多环境配置与马甲包制作

使用场景

场景一

大部分公司开发App时,都会分为debug环境和release环境,同时接口也是区分环境的,平时的开发和测试都是debug环境下,打包上线的时候改为release环境

场景二

制作马甲包,也就是在原来app的基础上,只修改app的名称,icon,LaunchImage,替换app中带有app名称的文本,并用另一个开发者账号发布,马甲包的数量不定。手动在代码里更改环境变量,替换图片肯定是不可取的,这里我们采用Configuration来实现这两个需求。定义好不同的Configuration后,就可以分别设置 Build、Archive、Test等操作分别使用哪一个 Configuration 进行编译,从而可以轻松地分离开各个环境变量的设置。

流程

新建Configuration

选择PROJECT -> Info -> Configurations,点击+别分选择DebugRelease,并重新命名为Debug-BetaRelease-Beta分别代表马甲包的两个Configuration,顾名思义,Debug是用来开发调试的,而Release用于打包发布的,区别是Debug模式下预编译的宏DEBUG=1,Release不能调试程序,并且Release编译时做了优化

Snip20190701_18

配置完成后的效果如下

Snip20190701_19

注意:新建完Configuration后要重新执行pod install

新建Scheme

完成了上一步的Configuration后,这里我们新建Scheme,命名为001-App配置多环境以及马甲包的制作-Beta,先 New Scheme,然后在Manage Scheme,大致操作如下:

Snip20190701_23

先点击New Scheme,新建一个名为001-App配置多环境以及马甲包的制作-Beta的Scheme.

Snip20190701_24

然后在Manage Scheme注意:勾选Shared

Snip20190701_25

最后在Edit Scheme中把RunArchive模式改成对应的Build Configuration

Snip20190701_26

点击Archived,然后选择对应的Release-Beta

Snip20190701_27

配置AppIcon和LaunchImage

新建App Icons & Launch Images,创建AppIcon-BetaLaunchImage-Beta

Snip20190701_28

Snip20190701_29

接下来我们工程中配置对应的AppIconLaunchImage,选择Targets -> Building Settings,搜索asset,按下图配置即可

Snip20190701_31

此时选择不同的Scheme运行,你会发现不同的Scheme已经有不用的AppIconLaunchImage

配置App名称、Bundle ID 和证书

  • 配置App名称

PROJECT -> Building Settings -> + -> Add User-Defined Setting,即增加用户自定义设置,添加一个App名称的设置,为不同的Configuration配置不同的App名称。

Snip20190701_32

然后在Info.plist中设置Bundle display name,为我们自定义设置的key,即${CUSTOMAPPNAME}

Snip20190701_33

  • 配置Bundle ID和证书

不同的马甲包,肯定是不同的bundle identifier,也就意味着需要不同的证书管理,那么此时设置TARGETS -> Build Settings中搜索bundle,设置Product Bundle Identifier

Snip20190701_34

证书配置如下

Snip20190701_35

其他配置

根据Configuration配置不同的预编译宏,在TARGETS -> Build Settings -> Preprocessor Macros进行配置,比如渠道号、接口域名等

Snip20190701_37

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef PrefixHeader_pch
#define PrefixHeader_pch

/** 渠道标识 **/
#ifdef MaJiaB
#define kChannelID = @"MaJiaB_1";
#endif


/** 接口域名配置 **/
#if DEBUG
#define TTK_URL_SSL_PREFIX @"http://www.baidu.com"
#else
#define TTK_URL_SSL_PREFIX @"http://www.sina.com"
#endif

#endif /* PrefixHeader_pch */

Snip20190701_39

如何巧妙的使用编译宏定义让代码在不同情况下执行

关于预编译宏定义如下

1
2
3
4
5
#ifdef SERVER_ENV
代码块一...
#else
代码块二...
#endif

如果标识符SERVER_ENV已经被#define过了,则对代码块一进行编译,否则对代码块二进行编译。

同时也有#ifndef,则与#ifdef刚好相反。

  • OPTIMIZE

用于release和debug的判断,当选择了OPTIMIZE时,可以让代码在Release模式下执行,在Debug模式下不执行

1
2
3
4
5
#ifndef __OPTIMIZE__
// 这里执行的是Debug模式下
#else
//这里执行的是Release模式下
#endif
  • i386 与 x86_64 :用于模拟器环境和真机环境的判断。满足该条件的代码只在模拟器下执行。示例代码如下:
1
2
3
4
5
#if defined (__i386__) || defined (__x86_64__)
// 模拟器下执行
#else
// 真机下执行
#endif
  • IPHONE_OS_VERSION_MAX_ALLOWED :当前编译的SDK版本,可以与IPHONE_9_0等宏定义进行比较,进行不同版本下代码的执行。示例如下:
1
2
3
4
5
6
7
if (__IPHONE_OS_VERSION_MAX_ALLOWED == __IPHONE_9_0)
{
//如果当前SDK版本为9.0是执行这里的代码
}else
{

}