在APP的开发过程中,我们经常会遇到需要多环境支持
开发环境:开发者日常开发的环境,完成功能模块
测试环境:用于测试,功能验证
生产环境:只包含通过了测试并验证过的功能模块,它是最终提交到 App Store 供终端用户使用的版本。
或是同时支持构建免费版 -- 收费版。
如何管理多个构建多环境支持?
1、创建不同的targets,每个target使用不同的Info.plist
,每选择一个target,就会使用不同的Info.plist
,因此可以此设置变量,如token或是不同环境的URL。
也可以使用Bundle Identifiers来实现,定义不同的preprocessor macros控制各个代码块的编译条件。
可查阅How to Use Xcode Targets to Manage Development and Production Builds
2、构建配置放到.xcconfig
文件中,并且在project的info的configurations内引用它。然后可以通过简单更改scheme来构建不同版本的APP,这也是本文的重点。
建立Build Configuration
首先,Xcode创建一个项目。或者是你想要从现有的项目开始也可以,应该会看到Xcode已经自动提供了两个不同的配置:Debug和Release,你可能之前没有注意到,你可以通过不同的配置,分別创建一个用于debug,一个用于release的版本。
现在我们要创建一个新的Configuration,命名
Staging
。点击配置列表下面的“+”,选择Duplicate Debug configuration
,因为从Debug配置中删除我们不需要的东西,比在Release配置放回所需的东西容易。
在刚创建的第一个单元格中,填写Staging,完成后现在有三个级别的配置。
使用Xcode配置文件(.xcconfig)
创建一个.xcconfig文件,在弹出的窗口中选择Configurations Settings File。 在next中,將其命名為“Staging”,并确保targets复选框全部都是未选取状态,因为我们不希望将其包含在APP的bundle中。
现在切换到project --> info的tab中,在Configurations展开列表,并且从下拉框中选择“Staging”。可以Debug、Release重复该流程。
更改构建配置(Changing the Build Information)
Xcode的配置文件设置,就可以非常直接的改变配置內容。假设你想要改变构建信息,如App Name、version,bundle identifier以及每个版本的bundle version,可以像这样配置每个.xcconfig文件:(xcconfig 概念及其作用,xcconfig的key-value参考)
Debug.xcconfig:
IS_APP_NAME = Donate Debug
IS_APP_VERSION = 0.3
IS_APP_BUNDLE_ID = com.intensifystudio.DonateDebug
Staging.xcconfig:
IS_APP_NAME = Donate Staging
IS_APP_VERSION = 0.2
IS_APP_BUNDLE_ID = com.intensifystudio.DonateStaging
Release.xcconfig:
IS_APP_NAME = Donate
IS_APP_VERSION = 0.1
IS_APP_BUNDLE_ID = com.intensifystudio.DonateRelease
你可以在project settings、info.plist、entitlement files中使用你的配置变量(configuration variables)。在本文中,我们将在info.plist
中使用它改变app名字、app版本和bundle identifier,如下所示:
IS作为前缀,可修改成自己喜欢的前缀。
更改App Icon
使用Xcode配置文件,可以轻松配置不同版本的app icon。 参考下列做法编辑每个.xcconfig文件:
Debug.xcconfig:
IS_APP_ICON = AppIconDebug
Staging.xcconfig:
IS_APP_ICON = AppIconStaging
Release.xcconfig:
IS_APP_ICON = AppIconRelease
切换到Build Settings
,将AppIcon
替换为${IS_APP_ICON}
然后在“Assets.xcassets”中创建几套iOS App Icon,并重命名为上面代码中配置的名字。
接着将icon拖进去,就大功告成了!
如何在代码中存取配置变量
Xcode配置文件非常强大,它可以用于其他设置。例如,如果不同版本的API密钥和服务端API不同,则可在每个.xcconfig文件中指定:
Debug.xcconfig:
SERVER_URL = http:\/\/api.intensifystudio.com/development
CONSUMER_KEY = ck_a57e4fa2e14c12ae3f400371cf2951ec3dea5_dev
CONSUMER_SECRET = cs_c847caa35ce1041e9c69d239141f13f63bb22b_dev
Staging.xcconfig:
BACKEND_URL = http:\/\/api.intensifystudio.com/staging
CONSUMER_KEY = ck_a57e4fa2e14c12f400371cf2951ec3dea5_staging
CONSUMER_SECRET = cs_c847caa35ce1041e9c69d239141f13f63bb22b_staging
Release.xcconfig:
BACKEND_URL = http:\/\/api.intensifystudio.com/
CONSUMER_KEY = ck_a57e4fa2e14c12f400371cf2951ec3dea5
CONSUMER_SECRET = cs_c847caa35ce1041e9c69d239141f1f63bb22b
接下來,通创建新的栏位,将这些变量添加到Info.plist
:
你就可以使用下面的代码在运行时从plist文件读取所需的值:
func infoForKey(_ key: String) -> String? {
return (Bundle.main.infoDictionary?[key] as? String)?
.replacingOccurrences(of: "\\", with: "")
}
在不同的构建配置之间切换
点击顶部的scheme即可更改scheme,选择设置好的build configuration。
总结
Xcode的Configuration file是配置不同build configuration的实际运用,开发者可以轻松管理构建变量。推荐在项目中大胆使用。