fastlane更新迭代比较快,博客仅供参考,具体以官方文档为准

fastlane官方号称用最简单的方式实现iOS、Android应用的自动构建和发布。

安装和初始化

确保安装了最新的xcode命令行工具

xcode-select --install

安装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的初始化就已经完成了。

20170626637372.png

分析

在执行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    
    #cocoapods  #实际上运行了`pod install`
    # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."    
  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
    # match(type: "appstore") # more information: https://codesigning.guide
    gym(scheme: "fastlaneProj") # Build your app - more options available
    # pilot
    # sh "your_script.sh"
    # You can also use other beta testing services here (run `fastlane actions`)
  end

  # You can define as many lanes as you want
  # 当上述流程全部执行成功后执行。
  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

卸载

 gem uninstall fastlane

or

brew cask uninstall fastlane

frameit 自动截图(套壳)

为什么要使用自动截图功能?

因为截图是个没技术含量又费时的过程,如果比如app实现了国际化,多种语言多个模拟器,一张张截图、分类,就很费劲了。

使用fastlane的snapshot能很方便地实现多语言、多模拟器的屏幕截图,截图完成后还会自动生成一个漂亮的html网页,以展示捕获的所有屏幕。

如何使用

准备工作

fastlane 截图功能用到了Xcode7引入的UI Tests功能。

如果不了解,建议看看这篇文章WWDC15 Session笔记 - Xcode 7 UI 测试初窥

工程配置

  1. 在项目中添加一个新的UI Test target(建议语言选择Swift,导入Swift文件更简单)
  2. 进入工程目录,运行fastlane snapshot init, 运行成功后在fastlane文件夹下生成一些新文件,其中包括SnapshotHelper.swift
  3. 添加SnapshotHelper.swift这个文件添加到 UI Test target
  4. 在测试类中,点击左下角的录制按钮,录制交互动作
  5. 在测试类中,要添加截屏的位置添加代码snapshot("01LoginScreen")
  6. 在测试类的setUp()方法中添加如下代码:

    let app = XCUIApplication()
    setupSnapshot(app)
    app.launch()

截屏

为了满足实际需要,需要先配置Snapfile 文件。

devices([
   "iPhone 6",
   "iPhone 6 Plus",
   "iPhone 5"
])

languages([
  "en-US",
  "zh-Hans"
])
#scheme "snapshotExample"
#截图文件数据位置
#output_directory "../screenshots"

执行fastlane snapshot就可以执行截屏脚本了。

接下来耐心等待就可以了。成功后会还生成一个html文件。

20170624210471.png

2017062451023htmlPagePreviewFade.jpg

重置模拟器

截图工具提供了我们重置所有模拟器的方法。 如果你截图过程中遇到了奇怪的问题,这个命令可能会很有帮助。

fastlane snapshot reset_simulators

上传导入App Store

假设一开始,就执行了 fastlane init,那么截图默认会在./fastlane/screenshots文件夹。

此时上传只需要一行命令:

 fastlane deliver

然后按提示进行操作就可以了。

自己遇到的问题

多语言测试截图失败

原因是自己的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 --force

还可传参数,如:

fastlane pem -a com.krausefx.app -u username

生成开发证书:

fastlane pem --development

给p12文件设置密码:

fastlane pem -p "MyPass"

可以指定输出名字:

fastlane pem -o my.pem

列出可用命令选项:

fastlane pem --help

注意事项

pem命令生成的p12文件可以没有密码或者空字符串当密码。这样尽管生成的文件是有效的,但mac的Keychain Access不会允许你打开没指定密码的p12。

2017062679494error.png

这时候,可以用OpenSSL验证文件:

openssl pkcs12 -info -in my.p12

如果要用keychain中的p12,比如说推送测试软件KnuffNWPusher,您可以使用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>

xcode refactor fastlane使用指南(二)