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 –