当前公司项目有test1,test2,stage,pre,prod5套环境,每次不同环境下测试都要手动修改url和一些第三方服务的APPID,手动修改往往会出错,造成很多不便,也不利于以后的自动化打包发布。

添加环境变量

第一次遇到这个需求,首先想到的就是通过环境变量来区分,之前开发的时候一般用到DEBUG这个环境变量

#ifdef DEBUG
// xxx
#end

系统默认会提供DebugRelease两套环境。我们在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四套

同时配置RunArchive下的对应的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