简单的 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
-
一般这样处理就没有问题了, 但是 如果开启了
generate_multiple_pod_projects
, 那么还是会pod
还是无法识别 -
开启 Cocoapods 新选项,加快项目索引速度 参考该文章解决
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 才有效.
关闭控制台的一些系统的打印
OS_ACTIVITY_MODE=disable
Discussion