Yifans_Z's Blog.

fastlane 入门使用

字数统计: 1.6k阅读时长: 21 min
2019/02/28 Share

fastlane-getting-started

这次以 fastlane 为例,尝试项目中有什么事情可以被自动完成。

fastlane 是 Ruby scripts 的集合,安装方法不多说了见 官网文档

fastlane 中有但不限于以下工具集:

  • produce 同时在 Apple Developer Portal 和 App Store Connect 中创建新的 iOS apps。
  • cert 自动创建和维护 iOS 签名证书。
  • sigh 创建,更新,下载和修复配置文件。
  • snapshot 自动在每台设备上获取 iOS 应用的本地化屏幕截图。
  • frameit 将您的屏幕截图放入正确的设备框架中。
  • gym 构建和打包您的 iOS apps。
  • deliver 将截图,元数据和您的应用上传到 App Store。
  • pem 自动生成并更新推送通知配置文件。
  • spaceship 一个 Ruby 库能够访问苹果开发者中心和应用商店连接 api。
  • pilot 自动化 TestFlight 部署并管理测试用户。
  • boarding 邀请 beta 测试人员。
  • match 使用 Git 同步整个团队的证书和配置文件。
  • scan 运行 app 测试。

实验环境:Xcode 10.1、Swift 4.2、fastlane 2.116.1、\$99 开发者账户

项目添加 fastlane

在项目根目录下:

fastlane init

在出现 What would you like to use fastlane for? 是选择 4 Manual setup,在根据提示回车确认。

之后项目文件中将新增:

  • Gemfile 这个文件包含了 fastlane gem 的依赖
  • fastlane 这个文件夹包含
    • Appfile 存储 app identifier,Apple ID 以及 fastlane 设置 app 所需的任何其他标识信息
    • Fastfile 管理 lanes 创建的可被调用的 actions

创建 App

打开 Fastfile 将里面所有内容替换为:

default_platform(:ios)

platform :ios do
# 1 lane 的描述
desc "Create app on Apple Developer and App Store Connect sites"
# 2 create_app 是这个 lane 的名字
lane :create_app do
# 3 使用 produce action 将 app 添加到 Developer Portal 和 App Store Connect
​ produce
end
end

打开 Appfileapple_id 前的 # 移除,将 [[APPLE_ID]] 替换为真实 Apple ID,这样 fastlane 将不会反复提示你输入。

如果 App Store Connect 和 Apple Developer Portal 可以将 apple_id 替换为:

apple_dev_portal_id("[[APPLE_DEVELOPER_ACCOUNT_USERNAME]]")
itunes_connect_id("[[APP_STORE_CONNECT_ACCOUNT_USERNAME]]")

打开命令行在项目目录输入:

fastlane create_app

根据提示输入密码,之后将提示你输入 bundle ID,以反 host 格式创建 ID,之后是 App name 最长 30 个字符。

完成后登陆 Apple Developer Center 和 App Store Connect,app 在二者已经都被创建了。

再次打开 Appfile 将 app_identifier 填写刚才创建的 bundle ID。

生成交付文件

bundle exec fastlane deliver

根据提醒暂不使用 Swift 代替 Ruby,因为 fastlane.swift 现在为 beta。

完成后 fastlane 文件夹中新增:

  • metadata 这个文件夹存放了 app 大部分的 metadata 元数据
  • Deliverfile 保存这剩余小部分的元数据
  • screenshots 将保存 app 截图

fastlane-getting-started-metadata

metadata 文件夹中文件内容就是提交给 App Store Connect,多语言 app 可以手动创建对应的语言文件夹。

更多 deliver 参数见 这里

自动截图

多种设备和多语言 app 的截图是繁杂的。

fastlane snapshot init

fastlane 文件夹中新增:Snapfile,将里面的所有内容替换为一下:

# 1 - 想截图的设备列表

devices([
"iPhone 8 Plus",
"iPhone SE"
])

# 2 - 支持的语言列表

languages([
'en-US',
'fr-FR'
])

# 3 - 包含 UI Tests 的 scheme 名字

scheme("mZone Poker UITests")

# 4 - 截图存储位置

output_directory "./fastlane/screenshots"

# 5 - 是否清理之前的截图

clear_previous_screenshots(true)

保存关闭,然后命令中执行:

fastlane snapshot init

fastlane-getting-started-screenshots

创建 Test Target

在 Xcode 选择 File -> New -> Target 选择 iOS UI Testing Bundle 点击 Next。

fastlane-getting-started-screenshots

Product Name 输入上面 scheme 填写的名字 MZone Poker UITests 点击 Finish。

之后将 fastlane 文件夹中的 SnapshotHelper.swift 拖到 mZone Poker UITests 中。

之后将 mZone_Poker_UITests.swift 中的 setUp() 和 tearDown() 移除,替换 testExample():

// 1 设置截屏和启动 app
let app = XCUIApplication()
setupSnapshot(app)
app.launch()
// 2 点击 Chip Count 输入框(在 Storyboard 中的 accessibility identifier 设置 "chip count")然后输入 10
let chipCountTextField = app.textFields["chip count"]
chipCountTextField.tap()
chipCountTextField.typeText("10")
// 3 点击 Big Blind 输入框 然后输入 100
let bigBlindTextField = app.textFields["big blind"]
bigBlindTextField.tap()
bigBlindTextField.typeText("100")
// 4 截图
snapshot("01UserEntries")
// 5 点击 what should i do 再进行截图
app.buttons["what should i do"].tap()
snapshot("02Suggestion")

之后创建 mZone Poker UITests scheme,点击 run stop 右边的按钮选择 Manage Schemes...

fastlane-getting-started-create-test-target

选择 Edit Schemes... 勾选 TestRun

fastlane-getting-started-create-test-target

打开 Fastfile 添加:

desc "Take screenshots"
lane :screenshot do
snapshot
end

命令行执行:

bundle exec fastlane screenshot

完成后将自动打开:

fastlane-getting-started-create-test-target

创建 IPA 文件

首先要确保已经 target 设置 bundle identifiersigning identity

命令行执行:

fastlane gym init

打开 Gymfile 替换为以下内容:

# 1 指定 scheme
scheme("mZone Poker")
# 2 指定存放 .ipa 文件夹
output_directory("./fastlane/builds")
# 3 从构建中排除 bitcode。Bitcode 允许 Apple 优化你的 app,但是现在排除它以提高构建速度。
include_bitcode(false)
# 4 从构建中排除符号。包含符号允许 Apple 访问应用程序的调试信息,但是现在排除它以提高构建速度。
include_symbols(false)
# 5 允许 Xcode 使用自动配置。
export_xcargs("-allowProvisioningUpdates")

打开 Fastfile 添加:

desc "Create ipa"
lane :build do
# 1 允许 Xcode 自动配置
enable_automatic_code_signing
# 2 构建号自增(App Store Connect 要求构建号不能重复)
increment_build_number
# 3 创建签名的 .ipa 文件
gym
end

保存后命令行执行:

bundle exec fastlane build

fastlane-getting-started-create-test-target

上传到 App Store Connect

使用 deliver 将截图、元数据、.ipa 文件上传到 App Store Connect。

替换 Deliverfile 内容:

# 1 价格为 0 则是免费应用
price_tier(0)
# 2 回答 Apple 在手动提交审核时会向您呈现的问题
submission_information({
export_compliance_encryption_updated: false,
export_compliance_uses_encryption: false,
content_rights_contains_third_party_content: false,
add_id_info_uses_idfa: false
})
# 3 提供应用评级配置位置
app_rating_config_path("./fastlane/metadata/app_store_rating_config.json")
# 4 提供.ipa文件位置
ipa("./fastlane/builds/mZone Poker.ipa”)
# 5 将s ubmit_for_review 设置为 true 以自动提交应用以供审核
submit_for_review(true)
# 6 必须在应用审核接受后手动发布应用
automatic_release(false)

Fastfile 中添加:

desc "Upload to App Store"
lane :upload do
deliver
end

然后命令行执行:

bundle exec fastlane upload

完成后,登录 App Store Connect。屏幕截图,元数据和构建应该在那里,等待审查。

将命令放在一起

打开 Fastfile 添加:

desc "Create app, take screenshots, build and upload to App Store"
lane :do_everything do
create_app
screenshot
build
upload
end

Deliverfile 添加:

force(true)

执行:

bundle exec fastlane do_everything

Reference:

– EOF –

CATALOG
  1. 1. 项目添加 fastlane
  2. 2. 创建 App
  3. 3. 生成交付文件
  4. 4. 自动截图
    1. 4.1. 创建 Test Target
  5. 5. 创建 IPA 文件
  6. 6. 上传到 App Store Connect
  7. 7. 将命令放在一起