fastlane更新迭代比较快,博客仅供参考,具体以官方文档为准
fastlane官方号称用最简单的方式实现iOS、Android应用的自动构建和发布。
安装和初始化
确保安装了最新的xcode命令行工具
安装fastlane
官方提供了三种安装方式。
Homebrew | Installer Script | Rubygems |
---|
macOS | macOS | macOS or Linux with Ruby 2.0.0 or above |
brew cask install fastlane | Download the zip file. Then double click on the install script (or run it in a terminal window). | sudo gem install fastlane -NV |
这里选用Rubygems的安装方式,如果安装失败尝试升级下ruby.
#安装fastlane
sudo gem install fastlane -NV
#查看版本
fastlane -v
fastlane init
进入项目.xcproject所在目录,执行fastlane init
#初始化fastlane
fastlane init
随后按提示输入Apple id、密码等信息(密码会被存储到keychain)。
- 登录成功后,会自动获取到App id等信息,如果没有在iTunes Connect或 Apple Developer Portal创建过,会弹出提示,根据实际需要进行操作。(fastlane会调用produce进行初始化)
[09:30:48]: This app identifier doesn't exist on iTunes Connect yet, it will be created for you
[09:30:48]: This app identifier doesn't exist on the Apple Developer Portal yet, it will be created for you
[09:30:48]: Please confirm the above values (y/n)
- 如果提示登录失败,按提示进行输入即可(如企业账号)。
这样对于一个项目来说就fastlane的初始化就已经完成了。
分析
在执行deliver init的过程中,会同步iTC中的所有语言的元数据和截图,并按照目录结构组织好 。
这里肯定会被创建的是Appfile和Fastfile。如果Deliverfile,screenshots和metadata目录没被创建,可以运行deliver init来创建(非企业应用)。
文件 |
--- | ---
Appfile | 从 Apple Developer Portal 获取和项目相关的信息 详情
Fastfile | 核心文件,存放lane任务
Deliverfile |deliver的配置文件,从 iTunes Connect 获取和项目相关的信息详细
metadata | 同步iTC中的元数据
screenshots | 同步iTC中的截图
关于fastfile:
里面存放了很多lane,每个lane相当于按顺序执行的工作流。每个lane可以存放多个action,action可以看做具体的执行动作。
fastlane_version "2.41.0"
default_platform :ios
platform :ios do
before_all do
end
desc "Runs all the tests"
lane :test do
scan
end
desc "Submit a new Beta Build to Apple TestFlight"
desc "This will also make sure the profile is up to date"
lane :beta do
gym(scheme: "fastlaneProj")
end
after_all do |lane|
end
error do |lane, exception|
end
end
在命令行中使用fastlane actions
可以列出所有的action,使用fastlane action [action的名字]可以查看该action的相关信息,最重要的是在帮助文档中的这里可以查看具体action的使用方法和示列。Action文档地址。
action举例 | 描述 |
---|
cocoapods | Runs pod install for the project |
scan | Easily run tests of your iOS app using |
gym | Easily build and sign your app using gym(打包) |
pilot | Upload a new binary to iTunes Connect for TestFlight beta testing(把应用发布到TestFlight |
testflight | Alias for the pilot action |
重新安装
brew cask reinstall fastlane
卸载
or
brew cask uninstall fastlane
frameit 自动截图(套壳)
为什么要使用自动截图功能?
因为截图是个没技术含量又费时的过程,如果比如app实现了国际化,多种语言多个模拟器,一张张截图、分类,就很费劲了。
使用fastlane的snapshot能很方便地实现多语言、多模拟器的屏幕截图,截图完成后还会自动生成一个漂亮的html网页,以展示捕获的所有屏幕。
如何使用
准备工作
fastlane 截图功能用到了Xcode7引入的UI Tests
功能。
如果不了解,建议看看这篇文章WWDC15 Session笔记 - Xcode 7 UI 测试初窥。
工程配置
-
在项目中添加一个新的UI Test target
(建议语言选择Swift,导入Swift文件更简单)
-
进入工程目录,运行fastlane snapshot init
, 运行成功后在fastlane文件夹下生成一些新文件,其中包括SnapshotHelper.swift
-
添加SnapshotHelper.swift
这个文件添加到 UI Test target
中
-
在测试类中,点击左下角的录制按钮,录制交互动作
-
在测试类中,要添加截屏的位置添加代码snapshot("01LoginScreen")
-
在测试类的setUp()
方法中添加如下代码:
let app = XCUIApplication()
setupSnapshot(app)
app.launch()
截屏
为了满足实际需要,需要先配置Snapfile
文件。
devices([
"iPhone 6",
"iPhone 6 Plus",
"iPhone 5"
])
languages([
"en-US",
"zh-Hans"
])
执行fastlane snapshot
就可以执行截屏脚本了。
接下来耐心等待就可以了。成功后会还生成一个html文件。
重置模拟器
截图工具提供了我们重置所有模拟器的方法。
如果你截图过程中遇到了奇怪的问题,这个命令可能会很有帮助。
fastlane snapshot reset_simulators
上传导入App Store
假设一开始,就执行了 fastlane init
,那么截图默认会在./fastlane/screenshots
文件夹。
此时上传只需要一行命令:
然后按提示进行操作就可以了。
自己遇到的问题
多语言测试截图失败
原因是自己的ui test方法没有写好。
func testSnapshots(){
let app = XCUIApplication()
snapshot("1Page")
app.buttons["myButton"].tap()
snapshot("1Page")
}
app.buttons["myButton"]
获取到当前屏幕上所有的按钮的代理,并去寻找myButton
按钮,但是不同语言中按钮的名字是不一样的,这样就到导致了截图失败。
解决方法,设置控件的identifier
,可以在代码或者Interface Builder中进行设置:
self.myButton.accessibilityIdentifier = @"myButton";
pem:生成推送证书
是否厌倦了手动创建和维护您的iOS应用程序的推送通知配置文件? 是否厌倦了为您的服务器生成一个pem文件?
fastlane做所有这些,只要简单一个fastlane pem
命令。
使用
fastlane pem
+------------------+------------------------+
| Summary for PEM 2.41.0 |
+------------------+------------------------+
| development | false |
| generate_p12 | true |
| force | false |
| save_private_key | true |
| app_identifier | com.tyrad.fastlaneProj |
| username | qianshangjia@126.com |
| team_id | ZAKS37HHGG |
| output_path | . |
+------------------+------------------------+
[10:24:58]: Starting login with user 'xxx@126.com'
[10:25:02]: Successfully logged in
[10:25:03]: Creating a new push certificate for app 'com.tyrad.fastlaneProj'.
[10:25:06]: Private key: /Users/admin/Desktop/snapshot-fastlane/fastlaneProj/production_com.tyrad.fastlaneProj.pkey
[10:25:06]: p12 certificate: /Users/admin/Desktop/snapshot-fastlane/fastlaneProj/production_com.tyrad.fastlaneProj.p12
[10:25:06]: PEM: /Users/admin/Desktop/snapshot-fastlane/fastlaneProj/production_com.tyrad.fastlaneProj.pem
做了哪些工作
- 创建新的签名请求(signing request)
- 创建新的推送证书( push certification)
- 下载这个证书(certificate)
- 在当前工作目录创建新的 .pem 文件,你可以上传到你的服务器
pem
不会revoke已经存在的证书,也不会下载已经存在的证书,因为私钥仅在创建的机器上可用。
实用命令
如果你已经有一个可用的推送证书(certificate),而且有效期至少还有30天以上,pem
就不会创建新的证书。如果你想要创建新的,使用force
:
还可传参数,如:
fastlane pem -a com.krausefx.app -u username
生成开发证书:
fastlane pem --development
给p12文件设置密码:
可以指定输出名字:
列出可用命令选项:
注意事项
pem
命令生成的p12文件可以没有密码或者空字符串当密码。这样尽管生成的文件是有效的,但mac的Keychain Access不会允许你打开没指定密码的p12。
这时候,可以用OpenSSL验证文件:
openssl pkcs12 -info -in my.p12
如果要用keychain中的p12,比如说推送测试软件Knuff或NWPusher,您可以使用openssl将p12导出到pem并返回到p12(设置密码)。
% openssl pkcs12 -in my.p12 -out my.pem
Enter Import Password:
<hit enter: the p12 has no password>
MAC verified OK
Enter PEM pass phrase:
<enter a temporary password to encrypt the pem file>
% openssl pkcs12 -export -in my.pem -out my-with-passphrase.p12
Enter pass phrase for temp.pem:
<enter the temporary password to decrypt the pem file>
Enter Export Password:
<enter a password for encrypting the new p12 file>