Fastlane使用总结(二)
常用命令:
fastlane actions: 展示所有有效action列表
fastlane action [action_name]: 展示一个action的详细说明,使用方法等
fastlane lanes: 展示fastfile中的所有lane
fastlane list: 展示fastfile中的所有的有效的lane
fastlane new_action: 创建一个新的action
fastlane env: 打印fastlane、ruby环境,一般提bug到issue的时候会要求提供
生命周期:
执行顺序 | 方法名 | 说明 |
---|---|---|
1 | before_all | 在执行 lane 之前只执行一次 |
2 | before_each | 每次执行 lane 之前都会执行一次 |
3 | lane | 自定义的任务 |
4 | after_each | 每次执行 lane 之后都会执行一次 |
5 | after_all | 在执行 lane 成功结束之后执行一次 |
6 | error | 在执行上述情况任意环境报错都会中止并执行一次 |
Sigh
如果你不确定证书目前是否可用,可以用Sigh自动生成获取证书。Sigh会自动根据Appfile里设置的app_identifier
从ADC(苹果开发者中心)生成证书,并下载到项目根目录下(不是fastlane目录),下载后自动安装。你可以通过指定output_path
指定证书下载位置。
PS:建议不要把这个文件夹同步到项目的git中(Fastlane提供了match
专门管理所有证书)。可以在.gitignore中可以忽略这个文件夹。
Sigh常用的配置项:
Name | Type | Description | Default |
---|---|---|---|
adhoc | bool | 获取adhoc证书 | fasle |
development | bool | 更新开发证书,不更新production 证书 |
false |
force | bool | 强制更新证书,不管证书是否在ADC中存在 | false |
iOS里code打包证书有4种,adhoc,inhouse,appstore,development证书。
价格 | AppStore证书 | In-House证书 | AdHoc证书 | Development证书 | |
---|---|---|---|---|---|
企业帐户 | $299 | √ | √ | √ | |
公司账号 | $99 | √ | √ | √ | |
个人账户 | $99 | √ | √ | √ |
其中In-House
的方式打包的ipa安装没有设备的限制。AdHoc
打包的ipa必须提前把设备的UDID添加到证书中,并且有100台设备限制。
所以如果你不指定adhoc
为true
,Sigh会识别帐户类型,企业帐户默认生成In-House
证书,公司账号和个人帐户默认生成AppStore证书。
Gym
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 |
Xcode7之后,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
Firim
Fir.im是一个ipa托管网站。你可以用AdHoc
或者In-House
的方式打包,上传到fir.im发送给测试人员测试。需要先注册Fir.im帐户,并生成Token
。这种方式适合:
- 小团队 => 测试的机器数量很少并且非常可控。直接连上开发机,真机调试一次,就可以添加
- 土豪 => 有企业帐户可以打
In-House
的包
Firim常用配置项:
Name | Type | Description | Default |
---|---|---|---|
firim_api_token | string | 指定fir.im的token
|
|
ipa | string |
ipa 地址 |
如果使用gym ,可以通过上下文获取 |
icon | string | icon的path,注意这里有个非常坑的地方,fir.im只支持jpg格式的图片 |
还有项如app_name
等等,是用来配置fir.im页面属性的。firim --help
Firim的配置文件是Firimfile
。初始化:
firim init
Firim
是我完全仿照fastlane组件的方式写的,所以也可以单独作为CLI
使用。
Deliver
Deliver可以完全管理与iTC的交互。其中包括:
- 上传和下载多语言截图
- 上传和下载多语言元数据
- 上传二进制文件
还记得上面初始化的时候初始化的metadata
,screenshots
目录么?iTC中的所有的元数据信息都被保存在metadata
中,所有的截图信息都被保存在screenshots
中。
metadata:
- 可以很容易的管理对应目录下的文件和iTC后台的表单项,在执行
deliver
时会自动被传到iTC。 - 在
metadata
目录下的文件,如copyright.txt
,是没有本地化的,在二层目录中的文件都是需要对应不同语言的表单项。 - 如果你不想修改某些项的信息,直接把对应的文件删除即可。
- 所有这些表单项也可以在
Deliverfile
中指定,Deliverfile
中指定的项优先级比文件高
screenshots:
- 如果不想更改截图,可以把整个截图目录删除
- 如果不使用
snapshot
(自动化截图),也可以自己截图放到对应目录下,比一张一张上传iTC快的多。截图在iTC中的排列顺序就是本地文件名的「字母表顺序」(在目录中右击,按文件名排序)。deliver
会识别图片分辨率,上传到对应设备中。
如果要通过deliver
修改元数据或截图,你必须提供所有iTC后台中有的语言。比如后台中有「简体中文」和「英文」,你也必须提供对应的zh-Hans
和en-US
文件,否则deliver
会报缺少语言的错误。可以在iTC后台提交的版本中删除语言。
Deliver常用配置项:
Name | Type | Description | Default |
---|---|---|---|
ipa | string |
ipa 地址 |
如果使用gym ,可以通过上下文获取 |
metadata_path | string | 指定metadata 目录地址 |
如果在fastlane 中./fastlane/metadata ,如果作为独立的命令行应用./metadata
|
screenshots_path | string | 指定screenshots 目录地址 |
如果在fastlane 中./fastlane/screenshots ,如果作为独立的命令行应用./screenshots
|
skip_binary_upload | bool | 跳过二进制文件上传,适用于只想改metadata
|
false |
skip_screenshots | bool | 跳过截图上传,如果截图没有变化,开启这项节约时间 | false |
skip_metadata | bool | 跳过元数据上传 | false |
force | bool |
deliver 会在上传时汇总信息生成HTML也,等待你审核。跳过这项审核此项设为true
|
false |
submit_for_review | bool | 上传完成是否自动提交审核 | false |
automatic_release | bool | 审核通过是否自动释放 | false |
price_tier | int | App价格级别。注意:这项提交当时就会生效,所以更改价格还是在后天手动操作 | |
submission_information | hash | 这是在iTC上点击提交之后的问答表格,可选项 | |
app_review_information | hash | 提供审核时的信息,详情 | |
app_icon | string | 指定icon 图片地址,必须为png 格式 |
-
submission_information =>
-
前缀
export_compliance
=> 对应「出口合规信息」,没有特殊情况都选false
就可以。 -
前缀
content_rights
=> 问你是否包含,显示,访问第三方内容(这项我没在我提交过程中找到),没有特殊情况也都选false
就可以。 -
前缀
add_id_info
=> 可就关键了,对应「广告标识符」,如果你在App中使用了IDFA
。你必须在这给个理由,而不能直接选false
。下图等价下表,App中投放了广告。
[ submission_information
-
submission_information({
export_compliance_available_on_french_store: "false",
export_compliance_contains_proprietary_cryptography: "false",
export_compliance_contains_third_party_cryptography: "false",
export_compliance_is_exempt: "false",
export_compliance_uses_encryption: "false",
export_compliance_app_type: nil,
export_compliance_encryption_updated: "false",
export_compliance_compliance_required: "false",
export_compliance_platform: "ios",
content_rights_contains_third_party_content: "false",
content_rights_has_rights: "false",
add_id_info_limits_tracking: "true",
add_id_info_serves_ads: "true",
add_id_info_tracks_action: "false",
add_id_info_tracks_install: "false",
add_id_info_uses_idfa: "true"
deliver
的CLI
工具:
- 下载iTC上的截图
deliver download_screenshots
- 下载iTC上的元数据
deliver download_metadata
发布到App Store
lane :deploy do
# 如果你用 pod install
cocoapods
# 不带adhoc参数,sigh会自动生成App Store证书(公司或个人帐户)
sigh
increment_build_number_in_plist(target: [target_name])
increment_version_number_in_plist(
target: [target_name],
version_number: '7.1.3'
)
# 指定输出目录
gym(
output_directory: './build',
)
# 上传所有信息到App Store
deliver(force: true)
end
appicon插件
fastlane add_plugin appicon
可能会报以下错误ImageMagick/GraphicsMagick is not installed
- 安装GraphicsMagick:
brew install graphicsmagick
- 卸载
brew uninstall imagemagick graphicsmagick libpng jpeg
brew cleanup -s
多scheme写法
platform :ios do #指定持续集成对象的平台名称
lane :dev do|options| #给lane命名
branch = options[:branch]
#这里我们项目为了区分线上环境和测试环境,而做了两个target
#关于target区分环境的方法,可以参考我同事的简书文章https://www.jianshu.com/p/23cc84d40423
#下面代码通过在终端输入1或者其他数字来选择要打包的target
#puts是ruby中的输出,gets为获取终端中输入的文字,gets需要指定STDIN包中的gets方法,否则会识别为其他包中的gets方法,具体为什么我也不知道
puts "请选择要打的scheme:(1:项目Target1,else: 项目Target2)"
scheme = STDIN.gets
# 通过判断输入内容,来区分一些打包信息,1后面加\n是因为在终端输入1再敲回车的时候scheme就包含了回车的内容,所以scheme == "1\n"
if scheme == "1\n"
#项目中target的名称,以QQ为例,如果我的target叫QQ,则下面填写QQ,如果是wechat,就填wechat
schemeName = "项目Target1"
#打包的用途,也就是app-store, package, ad-hoc, enterprise, development这几个中的一个,这里我们项目的target1用的是公司帐号,打的是开发包
export_method = "development"
else
schemeName = "项目Target2"
#这里我们项目的target2用的是企业帐号,打的是企业包
export_method = "enterprise"
end
#从蒲公英平台拿到的api_key和user_key,下面我会讲怎么拿到这两个key,存在下面两个变量中
api_key = "xxxxxxxxxxxxxxxxxxx"
user_key = "xxxxxxxxxxxxxxxxxxx"
#输入蒲公英上传ipa包后输入的版本描述信息
puts "请输入版本描述:"
desc = STDIN.gets
puts "开始打包 #{schemeName}"
# 开始打包
gym(
#指定scheme的名字
scheme: "#{schemeName}",
#输出的ipa名称
output_name:"#{schemeName}",
# 是否清空以前的编译信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"#{export_method}",
# 指定输出文件夹,这里会保存我们最后生成的ipa文件,也就是存到了我们上面提到的fastlane文件夹中的build文件夹中
output_directory:"./fastlane/build",
)
puts "开始上传到蒲公英"
#开始上传ipa到蒲公英,这里用的是蒲公英提供的插件
#update_description代表更新信息,password代表安装密码
pgyer(update_description: "#{desc}", api_key: "#{api_key}", user_key: "#{user_key}", password: "1111", install_type: "2")
#在上传完ipa后,打开ipa的存放文件夹,起到提示上传完成的作用
system "open ../fastlane/build"
end
end