正在加载今日诗词....
3 min read

简单的 iOS 多环境配置技巧

iOS 开发时经常会遇到切换环境配置的问题, 如何做到灵活多变是工程化问题中的一个.
简单的 iOS 多环境配置技巧

前言

iOS 开发时经常会遇到切换环境配置的问题, 如何做到灵活多变是工程化问题中的一个. 下面介绍一个简单的做法.

  • xcconfig 配置文件
  • shell 脚本
  • Podfile 配置问题

Configuration

创建多个环境的 xcconfig 文件

demo 中有:

  • Common 通用配置
  • Dev 开发环境 - DEBUG 代表调试模式
  • Test 测试环境 - DEBUG 代表调试模式
  • Staging 预发布环境 - RELEASE 代表生产模式
  • Production 生产环境 - RELEASE 代表生产模式

实际上 每个Api开发环境,都会配置 开发与调试模式 ,所以 xcconfig 会变得更多

拷贝配置文件

  • 其实可以全部在 xcconfig 文件配置, 不过在 json 文件中可读性更高, 传输方便

Copy Env 拷贝应用环境配置文件的脚本, 在 Targets 中选择 Build Phases ,点击 ➕ 添加 New Run Script Phase , 复制下面的内容

pwd
echo "${ENV_RESOURCE_PATH}"
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app

echo "Copying all files under ${ENV_RESOURCE_PATH} to ${BUILD_APP_DIR}"
cp "${ENV_RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"

配置 Project 中的 configuration

注意在使用 CocoaPods 的时候, 需要将 pod 生产的 target 也配置成自定义的 configuration 文件 , 并且在 xcconfig 文件中 添加 pod 生成的 xcconfig 的引用

Dev 的配置文件

#include "Pods/Target Support Files/Pods-LJEnvConfiguration_Example/Pods-LJEnvConfiguration_Example.dev.xcconfig"

配置好后, 执行 pod install 等就不会有 警告出现

关于环境变量的问题

如果使用了 pod 那么会导致 pod 无法识别 自定义的环境变量

  • 第一步: 在 Project -> Build Settings -> Preprocessor Macros 中 配置每个自定义环境变量的 DEBUG=1 或者 RELEASE=1 , 防止项目中根据这个做一些判断出错
  • 第二步: 在 podfile 的脚本中 , 做如下预处理
post_install do |installer|
    puts "##### post_install start #####"
        installer.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
            #'$(inherited)','-D','COCOAPODS' 这些是Pod默认添加的,所以重新设置的时候要带上。
            puts "如果打开了 generate_multiple_pod_projects, 则下面的配置会失效"
                if config.name == 'Dev'
                    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
                        elsif config.name == 'Production'
                            config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','RELEASE=1']
                                elsif config.name == 'Test'
                                    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
                                        elsif config.name == 'Staging'
                                            config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','RELEASE=1']
                end

            config.build_settings['ENABLE_BITCODE'] = 'NO'
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '8.0'
            end
        end
        puts "##### post_install end #####"

end
installer.pod_target_subprojects.flat_map { |p| p.targets }.each do |t|
    t.build_configurations.each do |c|
        c.build_settings['SWIFT_VERSION'] = '4.0' if swift_4_0_compatible.include? t.name
        c.build_settings['SWIFT_VERSION'] = '4.2' if swift_4_2_compatible.include? t.name
    end
end
  • 运行 pod install 发现 报错
undefined method `build_configurations' for nil:NilClass

Could not access pods_project on post_install hooks when incremental_installation is enabled

都是 incremental_installation 惹的祸, 必须注释 incremental_installation 后,后面的 post_install 才有效.

https://github.com/CocoaPods/CocoaPods/issues/8739 另一个相关的问题

关闭控制台的一些系统的打印

OS_ACTIVITY_MODE=disable

多环境配置 Demo

参考