当前公司项目有test1,test2,stage,pre,prod5套环境,每次不同环境下测试都要手动修改url和一些第三方服务的APPID,手动修改往往会出错,造成很多不便,也不利于以后的自动化打包发布。
添加环境变量
第一次遇到这个需求,首先想到的就是通过环境变量来区分,之前开发的时候一般用到DEBUG
这个环境变量
#ifdef DEBUG
// xxx
#end
系统默认会提供Debug
和Release
两套环境。我们在build settings
里面搜索Macros
也会找到Preprocessor Macros
这个配置。
我现在有5套环境,同时有Debug和Release的情况,那就是总共要添加10个环境变量。我们可以去PROJECT
-> Info
-> Configurations
下添加需要的环境变量。
把Debug作为本地运行的正式服环境,Release作为打包发布的正式服环境+号分别Duplicate另外4套环境。
最后结果就是这样
在PROJECT
-> Build Settings
下找到Preprocessor Macros
,就可以添加对应环境的环境变量了
当然有了环境变量,我们还要有不同的环境
配置Schema实现不同环境
这里有一个iOS交流圈:891 488 181 有兴趣的都可以来了解,分享BAT,阿里面试题、面试经验,讨论技术,裙里资料直接下载就行, 大家一起交流学习!
点击Xcode左上角的Schema,
一般项目只有一个主Schema,可能创建工厂的时候勾选了Test啥的那都不用管。 点击Edit Schema
可以看到里面的配置
我们平常本地跑都默认的是Debug那套环境,打包用的是Release。
点击Build Configurations
可以看到已经有我们刚才添加的环境了。那么现在就很简单了,在当前target下添加新的Schema
我要添加的有Test1,Test2,Stage,Pre四套
同时配置Run
和Archive
下的对应的build configuration
到现在算是差不多完成了,要跑不同的环境选择不同的Schema编译运行就OK了!
// config.h
#ifdef TEST1
#define BASE_URL = @"https://test1.com"
#elif TEST2
#define BASE_URL = @"https://test2.com"
#elif STAGE
#define BASE_URL = @"https://stage.com"
#elif PRE
#define BASE_URL = @"https://pre.com"
#else
#define BASE_URL = @"https://prod.com"
#endif
Pod的一些问题
新建的Configurations设置的环境变量在Pod -> Target里面没有添加上去。
当我切换Schema本地运行的时候,发现报错了,原因是用到的第三方库有一个判断DEBUG
环境的的地方始终没有通过,导致走了Release
的流程。
去Pods对应的的配置里面看到无论是PROJECT
的Pods还是下面Target里面的环境变量,虽然有之前在主工程添加的环境,但是环境变量却没有带过来。
当我手动在PROJECT
-> Pods
-> Build Settings
下添加对应的DEBUG=1
后发现可以解决,但是当我重新pod install
后,Pods的配置又全都重置了。这就有点尴尬了。
谷歌一番后……
原来要想修改Pods工程的配置,只能在Podfile里通过代码修改。具体的关于Podfile资料大家可以自行网上了解。
def schema_post_install(installer)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Debug_Test1'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
elsif config.name == 'Debug_Test2'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
elsif config.name == 'Debug_Stage'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
elsif config.name == 'Debug_Pre'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
end
end
end
end
target 'TestDemo' do
# 省略代码
post_install do |installer|
flipper_post_install(installer)
schema_post_install(installer)
end
end
手动加上DEBUG=1
即可。
新建的Configurations在Pods下是release模式
当我能成功运行的时候发现build的时间和tasks数量和原来debug模式下的不一样。最后发现原来是Pods下的新加的configurations的那些第三方库的模式都是Release。要想修改也需要在Podfile下指定build configurations的模式
project 'TestDemo', 'Debug_Test1' => :debug, 'Debug_Test2' => :debug, 'Debug_Stage' => :debug, 'Debug_Pre' => :debug
当重新pod install
之后
总结
以上就是通过schema实现多环境配置的全部流程了,算是实现了自动化打包的第一步吧,通过配置环境变量来实现不同环境区分。后面再通过fastlane实现自动打包,再写一个脚本自动更新代码和依赖,执行fastlane打包命令,测试环境下打包自动上传蒲公英给测试,正式环境上传App Store。
作者:神奇奶盖
链接:https://juejin.cn/post/6903719439405940750