多环境支持¶
搭建多环境支持,优化开发流程
基于同一套源代码自动构建出有差异功能的app。
支持多个团队并行开发。
分离测试和生产环境。
Xcode 构建基础概念¶
一般在构建一个 iOS App 的时候,需要用到 Xcode Project,Xcode Target,Build Settings,Build Configuration 和 Xcode Scheme 等构建配置。
xcconfig¶
创建Configurations目录,创建xcconfig文件
主工程创建Configuration Setting File文件,xcconfing是控制build setting的。
编译需要配置:
PROJECT->Info->Configurations->Debug和Release->每一个target对应一个xcconfig文件
只能配置一个config文件,如果有其它的config文件需要include。
配置了xcconfig,要在对应的build setting中对应设置的值给删除,改为设置$(inherited)
继承。
多个target¶
动态库或iWarch的应用的BundleID必须要跟主应用程序的bundleid一致,比如你的应用的id是com.mycop.hello,那么内嵌的id必须是com.mycop.hello.xxx
Xcode Project¶
Xcode Project用于组织源代码文件和资源文件。一个 Project 可以包含多个 Target,当新建一个 Xcode Project 的时候,会自动生成 App 的主 Target,Unit Test Target 和 UI Test Target。
使用Build Configuration 和 Xcode Scheme来管理多环境¶
在构建过程中使用Xcode Scheme
选择不同的Build Configuration
Xcode Scheme¶
Xcode Scheme用于定义一个完整的构建过程,包括指定哪些 Target 需要进行构建,构建过程中使用了哪个 Build Configuration ,以及需要执行哪些测试案例等等。在项目新建的时候只有一个 Scheme,但可以为同一个项目建立多个 Scheme。不过这么多 Scheme 中,同一时刻只能有一个 Scheme 生效。
环境变量¶
OBJC_PRINT_LOAD_METHODS:哪些类实现了load方法。
fastlane自动化打包¶
- 安装 Xcode command line tools:
xcode-select --install
- 安装fastlane:
sudo gem install fastlane
- cd工程所在目录,执行
fastlane init
- 选择2打包testfilght。
- 登录开发者账号、用户和访问、密钥,App Store Connect API,获取Issuer ID、密钥id,下载密钥p8文件、拷贝到fastlane文件夹。
fastlane [lane_name]¶
执行:fastlane [lane_name]
或者bundle exec fastlane [lane_name]
Gym常用配置项:¶
Name | Type | Description | Default |
---|---|---|---|
scheme | string | 指定需要编译的scheme | |
clean | bool | 是否在编译前clean | false |
output_directory | string | 导出目录 | ./ |
output_name | string | 导出ipa名字 | [app_name].ipa |
export_options | hash/string | 这里指定Xcode API的外部配置文件地址,或者配置hash,见下文 | |
export_method | string | 打包方式,可选项app-store ad-hoc package``enterprise``development``developer-id |
如果在fastlane中使用了sigh,这个值会从上下文获取 |
include_bitcode | bool | 是否开启bitcode |
Xcode API 默认值为true |
include_symbols | bool | 是否生成符号表 | Xcode API 默认值为true |
Xcode API允许我们指定一个plist
文件作为额外的配置文件。gym默认会帮你创建这个文件,你可以直接指定配置。更多关于plist可配置项,执行xcodebuild -help
查看Available keys for -exportOptionsPlist
。
export_method
, include_symbols
,和include_bitcode
这些参数都是exportOptionsPlist
的配置,对应method
,uploadSymbols
和uploadBitcode
。
Gym可以指定配置文件Gymfile
。
初始化:
gym init
Fastfile¶
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:ios)
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
increment_build_number(xcodeproj: "SCM.xcodeproj")
# gym(
# # 每次打包之前clean一下
# clean: true,
# workspace: "SCM.xcworkspace",
# scheme: "SCM",
# output_directory: './fastlane/release',
# output_name: 'SCM.ipa',
# configuration: 'Release',
# include_bitcode: true,
# include_symbols: true,
# # app-store, validation, ad-hoc, package, enterprise, development, developer-id and mac-application
# export_method: 'app-store',
# export_xcargs: '-allowProvisioningUpdates'
# )
build_app(
# 每次打包之前clean一下
clean: true,
workspace: "SCM.xcworkspace",
scheme: "SCM",
output_directory: './fastlane/release',
output_name: 'SCM.ipa',
configuration: 'Release',
include_bitcode: false,
include_symbols: true,
# app-store, validation, ad-hoc, package, enterprise, development, developer-id and mac-application
export_method: 'app-store',
export_xcargs: '-allowProvisioningUpdates'
)
# mac上的通知弹窗,通知打包完毕
notification(app_icon: './fastlane/icon.png', title: '打包成功', subtitle: '打包成功,已导出安装包', message: '准备发布中……')
# 上传到testflight
# upload_to_testflight和(之间不要有空格
# upload_to_testflight(
# # 上边设置的授权信息
# api_key: get_app_store_connect_api_key,
# skip_waiting_for_build_processing: true,
# # 打包好要上传的文件
# ipa: './fastlane/release/SCM.ipa',
# skip_submission: true
# )
upload_to_app_store(
# 上边设置的授权信息
api_key: get_app_store_connect_api_key,
# 打包好要上传的文件
ipa: './fastlane/release/SCM.ipa',
app_identifier: "com.ningmengyun.SCMTest",
# skip_waiting_for_build_processing: true,
# skip_submission: true,
skip_metadata: true,
skip_screenshots: true,
precheck_include_in_app_purchases: false,
)
# 通知上传成功
notification(app_icon:"icon.png",title:"上传成功",subtitle: "IPA上传成功", message: "自动打包完成!")
end
# 配置上传到App Store connect的api_key
# 通过这种设置可以绕过二次认证等验证操作,实现一键打包上传
desc 'Get App Store Connect API key'
private_lane :get_app_store_connect_api_key do
# The key needs to have App Manager role, see https://github.com/fastlane/fastlane/issues/17066
key_content = ENV["APP_STORE_CONNECT_API_CONTENT"] # Make sure setting this environment variable before call this lane.
api_key = app_store_connect_api_key(
# 通过苹果申请的key id,申请同时会生成issuer_id和一个.p8授权文件,就是以下参数,文件只能下载一次,注意保存,申请方式https://appleid.apple.com/account/manage中的专用密钥
key_id: '9B6ASXN3GN',
issuer_id: '69a6de8f-0a10-47e3-e053-5b8c7c11a4d1',
# 授权文件路径
key_filepath: './fastlane/AuthKey_9B6ASXN3GN.p8',
# key_content: "-----BEGIN EC PRIVATE KEY-----\n" + key_content + "\n-----END EC PRIVATE KEY-----",
duration: 1200,
in_house: false
)
api_key
end
end
Appfile¶
app_identifier("com.ningmengyun.SCMTest") # The bundle identifier of your app
apple_id("zirongzhang@yuncaishui.com") # Your Apple Developer Portal username
# itc_team_id("118426720") # App Store Connect Team ID
team_id("FHBV35YZLP") # Developer Portal Team ID
# For more information about the Appfile, see:
# https://docs.fastlane.tools/advanced/#appfile