简介
fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android的自动化签名、配置、打包、发布等工作
为什么要用fastlane?
因为一行命令就可以实现编译、打包(ad-hoc&app store)、发布(蒲公英、App Store),剩下的时间你就可以愉快地喝茶看新闻了。而且配合Jenkins可以很好地实现持续集成,举个例子:在公司的Gitlab上打一个v开头的tag,就会自动编译打包新版本啦
话不多说直接进入实战环节,其他介绍可参考:blog.devzeng.com
安装fastlane:
sudo gem install fastlane
注:下文的PROJECT_DIR
指的是工程根目录,eg:/Users/pan/Documents/Project/Demo/FastLaneDemo2
初始化fastlane
先创建工程或打开工程,这里以创建FastLaneDemo2
为例,在Xcode创建FastLaneDemo2
之后,先取消Xcode自动管理签名选项:
初始化fastlane,终端运行:
fastlane init
终端: What would you like to use fastlane for?
你:选择 3. ?? Automate App Store distribution
,即发布自动化,这里主要是想自动配置开发者账号
终端:Please enter your Apple ID developer credentials Apple ID Username:
你:输入自己的AppleID(开启两步验证的账号要输入验证码)
终端:Do you want fastlane to create the App ID for you on the Apple Developer Portal? (y/n)
你:输入n,不在Apple Developer创建应用
终端:Would you like fastlane to create the App on iTunes Connect for
you? (y/n)
你:输入n,不在iTunes Connect 创建应用
终端:Continue by pressing Enter ?
你:三次Enter键
执行完这几部就会发现工程根目录新增了fastlane文件夹,打开PROJECT_DIR/fastlane/Appfile
文件,会发现开发者账号配置完毕:
app_identifier("com.showu.FastlaneDemo2") # 你的应用的 bundle identifier
apple_id("3*******5@qq.com") # 你的AppleID邮箱
itc_team_id("11*****78") # iTunes Connect Team ID
team_id("6FB****FUR") # Developer Portal Team ID
在Apple Developer和iTunesConnect创建App
在PROJECT_DIR/fastlane/Fastfile
文件增加:createApp
Action
#在iTunesConnect创建App
#如果出现The app name you entered is already being used错误请更换app_name值
#push_notification: "on"表示App开启通知功能
lane :createApp do
produce(
username: '3*******5@qq.com',
app_identifier: 'com.showu.FastLaneDemo2',
app_name: 'FastLaneDemo2018',
language: 'English',
#如果只在AppleDeveloper创建app,不在iTunesConnect创建app的话
#skip_itc: true,
app_version: '1.0',
enable_services: {
app_group: "on",
push_notification: "on",
}
)
end
这里用到了fastlane的第一个工具:produce(←push_notification等更多参数配置请戳进去查看)。作用是使用命令行在iTunes Connect和Dev Portal上创建新的iOS应用程序
终端输入
fastlane createApp
刷新Apple Developer和iTunesConnect官网,会发现新增了一个App:FastLaneDemo2018
创建、下载、安装Provisioning Profiles
PROJECT_DIR/fastlane/Fastfile
文件增加:adhoc_profile
Action
#下载provisioning_profile
lane :adhoc_profile do
#如果没有在Apple Developer创建证书的话,get_certificates会帮你自动创建证书
get_certificates
sigh(
username: '3*******5@qq.com',
app_identifier: 'com.showu.FastLaneDemo2',
force: true,
provisioning_name: 'com.showu.FastLaneDemo2_AdHoc',
ignore_profiles_with_different_name: true,
adhoc: true
)
end
终端输入
fastlane adhoc_profile
小插曲:
{"responseId"=>"2914996e-aaef-47d8-b279-f0ca557275a4", "resultCode"=>35, "resultString"=>"There were errors in the data supplied. Please correct and re-submit.", "userString"=>"There are no current IOS devices on this team matching the provided device IDs.", "creationTimestamp"=>"2018-06-04T09:11:01Z", "protocolVersion"=>"QH65B2", "userLocale"=>"en_US", "requestUrl"=>"https://developer.apple.com/services-account/QH65B2/account/ios/profile/createProvisioningProfile.action", "httpCode"=>200, "validationMessages"=>[{"validationKey"=>"deviceIds", "validationUserMessage"=>"There are no current IOS devices on this team matching the provided device IDs."}]}
原因:There are no current IOS devices on this team matching the provided device IDs.
因为用的是新的开发者账号,所以AppleDeveloper没有添加设备,所以需要添加至少一台设备才能打Ad-Hoc包
既然用了fastlane,咱就可以用命令行来做这个操作:
添加Devices到AppleDeveloper
创建一个制表符tab分隔的文件devices.txt
如下:
Device ID Device Name
6ccb3dc72b0c574fa5e****29d3cad609d3cb080 Pan
4af771e47a9067610d****846be8ea5f9bc0faa1 Yan
注意:
要放在PROJECT_DIR
路径下面,每行包含一个设备ID和一个设备名称。您可以将第一行用于标题,因为该行在分析时会被忽略。
第二行是设备ID和自定义名称,中间要加tab符号,推荐使用Sublime Text文本编辑器
打开AppleDeveloper的TXT文件,参考:help.apple.com
PROJECT_DIR/fastlane/Fastfile
文件增加:add_device
action
lane :add_device do
register_devices(
devices_file: "./devices.txt"
)
end
终端输入
fastlane add_device
设备添加成功!
重新下载安装provisioning profile:
fastlane adhoc_profile
会发现工程根目录多了AdHoc_com.showu.FastLaneDemo2.mobileprovision
文件,现在我们就可以愉快地打包了
打Ad-Hoc包
如果有多个Target,需要先设置scheme,参考:developer.apple.com
Product > Schemes > Manage Schemes, 点击 '+' 按钮, 选择自己刚才新建的target (FastLaneDemoDev),点击 'OK' 按钮,右侧的Shared
选项记得勾上
PROJECT_DIR/fastlane/Fastfile
文件增加:adhoc
Action
#打ad-hoc包
lane :adhoc do
#build_app 是gym的别名,可以换成gym
build_app(
scheme: "FastLaneDemoDev",
export_method: "ad-hoc"
)
end
然后打开Xcode工程,选择合适的配置文件:
终端输入:
fastlane adhoc
即可在工程根目录看到生成的ipa
如果需要上传ipa到蒲公英,可先安装蒲公英的 Fastlane 插件,终端输入:
fastlane add_plugin pgyer
会在PROJECT_DIR/fastlane/
新增Pluginfile
文件、修改Gemfile
文件
修改PROJECT_DIR/fastlane/Fastfile
文件,增加如下action,增加上传到蒲公英功能,参数获取请参考:蒲公英官网
#打ad-hoc包
lane :adhoc do
#build_app 是gym的别名,可以换成gym
build_app(
scheme: "FastLaneDemoDev",
export_method: "ad-hoc"
)
#上传到蒲公英
pgyer(api_key: "c9f01d6**************c206ea2cd", user_key: "2dfd4fc**************c7b758b1")
# upload_to_app_store(skip_metadata: true, skip_screenshots: true)
end
打App Store包
修改PROJECT_DIR/fastlane/Fastfile
文件,增加如下action
lane :appstore_ipa do
#下载安装provisioning profile
sigh(
username: '3*******3@qq.com',
app_identifier: 'com.*****.FastlaneDemo1',
force: true,
provisioning_name: 'com.*****.FastlaneDemo1 AppStore',
ignore_profiles_with_different_name: true,
)
gym(
scheme: "FastlaneDemo1",
export_method: "app-store",
#如果用到了LLVM混淆工具的话可以指定toolchain(下面是https://github.com/HikariObfuscator/Hikari):
#toolchain:"com.naville.hikari",
output_name:"FastlaneDemo1_AppStore.ipa"
)
end
然后打开Xcode工程,在Target - General - Signing(Release) 选择合适的配置文件(同上),运行fastlane appstore_ipa
即可生成ipa
上传ipa到iTunesConnect
在PROJECT_DIR/fastlane/Fastfile
文件新增以下Action:
lane :upload do
# upload_to_app_store
# submit_for_review:上传完成后提交新版本进行审查,这里选择不,提交审核前自己检查下
# force:跳过HTML报告文件验证
# ignore_language_directory_validation:在元数据和screeenshot目录中发现无效语言时忽略错误
deliver(
submit_for_review: false,
force: true,
ignore_language_directory_validation:true,
metadata_path: "./metadata"
)
end
这里用到了一个deliver工具,可上传二进制文件到iTunesConnect,我这里忽略了商店截图等参数的配置,直接上传二进制文件,如果不想登录iTunesConnect一个个地设置请参考(deliver章节](https://docs.fastlane.tools/actions/deliver/),这样在本地填好了txt文本就可以自动帮你填写提交审核需要的资料了
终端运行fastlane upload
,几分钟后就可以在构建版本里看到了
当然,你也可以把前面的所有action实现组合一下,用一个新action代替
其他实用Action
生成不同尺寸的icon
准备一张1024*1024的图片,放到根目录,
先安装appicon插件,更多参数请参考appicon README:
fastlane add_plugin appicon
再在PROJECT_DIR/fastlane/Fastfile
文件新增以下代码:
lane :generate_icon do
#执行自定义脚本,比如修改启动页图片
# sh "your_shell.sh"
#如果支持iPad请使用[:ipad, :iphone, :ios_marketing]
appicon(
appicon_image_file: './AppIcon.png',
appicon_devices: [:iphone, :ios_marketing],
appicon_path: 'FastlaneDemo2/Assets.xcassets'
)
end
运行fastlane generate_icon
,即可在Xcode工程生成各种尺寸的icon