当开发的应用越来越多,或者应用提交的频率越来越高,就会体会到打包、提交这些重复的工作是多么枯燥且无聊还耗时;那么自然就会考虑让机器帮我们完成这一系列的工作,fastlane无疑是这样一个理想好用的工具;
fastlane初始化
- 安装正确的Ruby版本,需要2.0及以上版本
ruby -v
- 安装fastlane
sudo gem install fastlane
或者
brew install fastlane
- 初始化配置
cd到项目路径下,执行命令
fastlane init
- 首先会提示让你选择fastlane用途,因为需要提交App Store这里选择3
- 输入Apple ID和密码及验证码
- 选择是否下载metadata(如果App Store上对应的Apple ID已经有相应的App,则会自动下载所有的app数据)
metadata数据包括App的预览/截屏图片,图片比较多比较大时可能只能下载到部分图片;
这时可以执行以下命令单独下载图片:
fastlane deliver download_screenshots
如果在下载图片这步报错,需要添加--use_live_version
- fastlane结构
初始化成功后,项目下会多出一个fastlane
的文件,所有数据、配置均在这个目录下;
如果fastlane目录下的文件缺少Deliverfile
、 metadata
,可能是在fastlane init的第一步选错了选项;可以执行以下命令重新生成:
fastlane deliver init
fastlane配置
- Appfile
这个文件主要配置、app和apple id相关信息;包括app_identifier,apple id,team id;这个一般会根据你初始化填的Apple ID自动生成; - Deliverfile
这个文件就是配置App提交审核的相关信息;有两种方式:- 使用metadata
所有数据都会直接metadata文件下自动读取,这种方式Deliverfile配置比较简单:
- 使用metadata
# The Deliverfile allows you to store various App Store Connect metadata
# For more information, check out the docs
# https://docs.fastlane.tools/actions/deliver/
metadata_path "./fastlane/metadata" # 根据你自己的metadata路径配置
force true # Skip verification of HTML preview file
submit_for_review false # 提交审核
automatic_release false # 自动发布
#auto_release_date # 自动发布时间
skip_screenshots false # 是否不更新预览图
overwrite_screenshots true # 是否清空之前的预览图再添加
skip_binary_upload false # 是否不上传ipa
- 编写脚本
不使用metadata,相关信息直接编写对应的命令;这些命令和apple developer网站添加提交信息都是一一对应的,可以把它看成通过接口的形式添加应用信息;
具体的命令可以参考官网,说明的比较详细了;
贴一个比较详细的配置:
# The Deliverfile allows you to store various App Store Connect metadata
# For more information, check out the docs
# https://docs.fastlane.tools/actions/deliver/
#metadata_path "./fastlane/metadata"
#skip_metadata true # 是否使用metadata
#screenshots_path "./fastlane/screenshots"
force true # Skip verification of HTML preview file
submit_for_review false # 提交审核
automatic_release false # 自动发布
#auto_release_date # 自动发布时间
skip_screenshots false # 是否不更新预览图
overwrite_screenshots true # 是否清空之前的预览图再添加
skip_binary_upload false # 是否不上传ipa
primary_category 'BUSINESS' # 分类
copyright("@#{Time.now.year} xx版权所有 翻版必究") # 版权信息
keywords({ # 关键字
"en-US" => "english is poor",
"zh-Hans" => "关键词1,关键词2"
})
support_url({ # 技术支持网站
"en-US" => "https://xxx.com",
"zh-Hans" => "https://xxxx.com"
})
submission_information({ # 使用广告的情况
add_id_info_uses_idfa: true,
add_id_info_serves_ads: false,
add_id_info_tracks_install: false,
add_id_info_tracks_action: false,
add_id_info_limits_tracking: false
})
app_review_information( # 审核信息
first_name: "xx",
last_name: "xx",
phone_number: "+8618xxxxxxxx",
email_address: "[email protected]",
demo_user: "xxxxxxx",
demo_password: "1234567",
notes: ""
)
app_review_attachment_file "./fastlane/fastSign.MP4" # 附件信息
app_version '5.7.8'
#build_number '5.7.8'
name({ # app名称
"en-US" => "english is poor",
"zh-Hans" => "应用名称"
})
privacy_url({ # 隐私政策url
"en-US" => "https://xx.xx.com/xxx",
"zh-Hans" => "https://xx.xx.com/xxx"
})
release_notes({ # 版本新增内容
"en-US" => "english is poor",
"zh-Hans" => "1) 升级测试第一行\n2) 升级测试第二行"
})
description({ # 描述
"en-US" => "english is poor",
"zh-Hans" => "应用描述。。。。
"
})
需要注意的是,一些信息比如privacy_url,release_notes是区分地区的,配置时需要编写两套:en-US
,zh-Hans
否则执行会报错;
- Fastfile
这个文件就是配置我们需要执行的脚本;
在对 Fastfile 进行配置前,我们先了解下几个概念;-
lane
lane可以理解为 fastlane 的执行脚本,一个Fastfile 里可以编写任意个lane,每个lane都可以独立运行,也可以嵌套运行。 -
fastlane actions
actions相当于就是对一些脚本的封装,为了方便我们使用,fastlane定义了很多actions供我们使用,可以像函数调用一样实现不同的功能;同时我们也可以自定义actions;
官方定义好的actions:https://docs.fastlane.tools/actions/,常用的actions有:gym
,deliver
,cocoapods
等
-
应用打包到提交App Store审核的Fastfile大致如下:
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:iOS)
platform :iOS do
desc "sumbmit" # lane描述
lane :upload_app do
# 打包
gym(
scheme: "your scheme",
workspace: "your.xcworkspace",
include_bitcode: false
)
# 发布
deliver
end
end
运行
所有都配置好后,cd到项目路径执行需要的lane
fastlane upload_app
之后命令行就会输出相应的日志;
deliver阶段,如果Deliverfile配置缺少,命名行都会有错误日志:
根据对应的提示补充即可;
需要注意的是,上传元数据时,App Store要求使用专用密码
;否则将会报错
专用密码可以在apple accout页面设置
Multi-Target打包、发布
以上对单个应用的配置相对比较简单,但当需要提交多个应用,比如一个project中有多个target时,该怎么办呢;无需为每个target配置一份脚本,fastlane提供了Environment Variables,也就是环境变量;可以通过配置不同的环境变量实现Multi-Target打包、发布;
具体步骤:
- 新建Environment文件
fastlane的Environment文件为.env文件,fastlane初始化后,默认不会有.env配置文件,需要手动添加文件;
cd到fastlane文件目录下,为每个target创建.env文件touch .env.targetA touch .env.targetB
.开头的文件为隐藏文件,添加后显示隐藏文件即可看到添加的.env文件;
- 配置不同的环境变量
根据自己的业务需求,归纳出变量并为每个target的.env文件配置;
.env.targetA
APP_IDENTIFIER = "com.xxx.targeta"
SCHEME = "targetA"
SCREENSHOTS_PATH = "./fastlane/targeta/screenshots"
APP_REVIEW_ATTACHMENT_FILE = "./fastlane/targeta/fastSign.MP4"
APP_VERSION = "5.0.0"
APP_NAME = "第一个APP"
DESCRIPTION = "第一个APP的描述"
.env.targetB也是一样的配置、只是value更换为自己需要的;
- 使用环境变量
环境变量在Appfile、Deliverfile、Deliverfile等文件中均可使用;使用语法:
ENV['变量KEY']
Appfile
app_identifier(ENV['APP_IDENTIFIER'])
Deliverfile
app_version ENV['APP_VERSION']
#build_number ENV['APP_VERSION']
name({ # app名称
"en-US" => "english is poor",
"zh-Hans" => ENV['APP_NAME']
})
description({ # 描述
"en-US" => "english is poor",
"zh-Hans" => ENV['DESCRIPTION']
})
- 执行
执行时需要指定对应的环境变量
fastlane upload_app --env targetA
- lane嵌套
之前介绍lane时说过每个lane都可以独立运行,也可以嵌套运行
,对于需要一键打包提交多个target的,我们就可以编写嵌套的lane:
Fastfile
default_platform(:iOS)
platform :iOS do
desc "sumbmit_all"
lane :upload_all do
sh "fastlane upload_app --env targetA"
sh "fastlane upload_app --env targetB"
end
desc "sumbmit"
lane :upload_app do
gym(
scheme: ENV[' SCHEME'],
workspace: "app.xcworkspace",
include_bitcode: false
)
deliver
end
end
- 批量打包、提交
fastlane upload_all
如果一切正常的话,应用就已经自动提交审核了;本来繁琐的事情最后转换为fastlane upload_all一句命令搞定,省时省力还能愉快的摸鱼
AppleID登录有效期为1个月,超过一个月后连接App Store时会提示输入6 digit码;如果输入后不能正常登录;
需要执行命令:
bundle exec fastlane spaceauth
重新验证、获取session;