使用fastlane deliver 自動上傳App Store Connect 物料和截圖

使用fastlane deliver 自動上傳App Store Connect 物料和截圖

 

背景

時光荏苒,今年發生了很多事情(省略2w字)。最終iOS商店頁物料上傳的工作,輾轉最終準備交給開發團隊來處理。

運營丟過來的物料有6個國家,10種語言,每個語言6~7張截圖,各種主標副標變更,更新點文案,哇的一下就哭出來了。

程序員懶癌發作,經過大概30s的google搜索和10s的艱難決策,我最終選擇了fastlane。

提交在即,讓持續集成幫忙估計不現實,就自己開始搞了。(當然最終還是希望能夠放在持續集成一起完成。)

fastlane

fastlane是爲iOS和Android應用程序自動化測試部署和發佈的最簡單方法。🚀它處理所有繁瑣的任務,如生成屏幕截圖,處理代碼簽名以及發佈應用程序。

 

 

 

fastlane組件

fastlane是一套工具集,包括:

  • 測試
    • scan => 自動運行測試工具,並且可以生成漂亮的HTML報告
  • 證書,配置文件
    • cert => 自動創建管理iOS代碼簽名證書
    • sigh => 一聲嘆息啊,這麼多年和Provisioning Profile戰鬥過無數次。總是有這樣那樣的問題導致配置文件過期或者失效。sigh是用來創建、更新、下載、修復Provisioning Profile的工具。
    • pem => 自動生成、更新推送配置文件
    • match => 一個新的證書和配置文件管理工具。我會另寫一篇文章專門介紹這個工具。他會所有需要用到的證書傳到git私有庫上,任何需要配置的機器直接用match同步回來就不用管證書問題了,小團隊福音啊!
  • 截圖
    • snapshot => 用Xcode7推出的UI test功能實現自動化截圖
    • frameit => 可以把截的圖片自動套上一層外邊框
  • 編譯
    • shenzhen => 當年大名鼎鼎的自動編譯工具,現在已經被棄用
    • gym => Fastlane家族的自動化編譯工具,和其他工具配合的非常默契
  • 發佈
    • produce => 如果你的產品還沒在iTunes Connect(iTC)或者Apple Developer Center(ADC)建立,produce可以自動幫你完成這些工作
    • deliver => 自動上傳截圖,APP的元數據,二進制(ipa)文件到iTunes Connect
  • TestFlight管理
    • pilot => 管理TestFlight的測試用戶,上傳二進制文件
    • boarding => 建立一個添加測試用戶界面,發給測試者,可自行添加郵件地址,並同步到iTC
  • 輔助工具
    • spaceship => 爲pilot,boarding和deliver等工具提供和 iTC 和 ADC 的交互API。spaceship本來是個獨立的項目,後來被Fastlane收編進來
    • WatchBuild => 是一個獨立的iTC監控工具,開啓WatchBuild可以監控iTC上的文件狀態,彈出MacOS自帶的Notification
  • Android
    • supply => 自動上傳到Google Play工具(如果有時間,我想把國內提供API的Android Store都寫個插件自動上傳,這個問題從10年我剛開始工作就覺得是個痛點)
    • screengrab => Android的自動截圖工具

fastlane中的概念

fastlane命令是一個流程控制的命令行工具(CLI),通過內部集成action和第三方的action完成一系列控制流程。運行fastlane命令行工具,會讀取當前目錄或者./fastlane目錄下的Fastfile配置文件。

在Fastfile中:

  • action => Fastlane中的每一條命令都是一個擴展(action),上面提到的deliver,sigh之類的工具本身是CLI,但是在Fastlane中內嵌了對他們支持的action
  • lane => Fastlane中流程的合集,每一個動作即可以是action,也可以是其他的lane。語法和ruby中的rake非常像

一個簡單的發佈流程:

1

2

3

4

5

6

7

8

9

10

11

12

lane :deploy do

# 執行 pod instasll

cocoapods

# 執行 carthage bootstrap

carthage

# 增加build版本號

increment_build_number

# 編譯代碼

gym

# 發佈到Apple Store

deliver(force: true)

end

總之,fastlane幫你統一定義、運行、自動化你的app發佈流程,並且可以和其他第三方工具如CocoaPods等很好的結合,也可以和其他第三方持續集成(Continuous Integration)工具如Jenkins等完美的結合。

fastlane看起來就是爲了持續部署(Continuous Deployment)而生。

Deliver

Deliver可以完全管理與iTC的交互。其中包括:

  • 上傳和下載多語言截圖
  • 上傳和下載多語言元數據
  • 上傳二進制文件

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後臺提交的版本中刪除語言。

目標

先看下iOS開發,打包和發佈的流程:

  1. 開發前,需要登錄蘋果開發者後臺創建App、Provisioning Profiles、certificates等;
  2. 使用Xcode開發,然後將上述相關文件和證書配置好;
  3. 編譯項目並自測;
  4. Archive項目;
  5. 上傳包到iTunes後臺;
  6. 配置TestFlight,準備測試剛上傳的版本;
  7. 發佈測試版本;
  8. 測試發現問題,重回2;
  9. 測試完成,在iTunes後臺提交版本截圖、描述等信息;
  10. 提交App Store審覈;

我們目標是9:提交截圖和元數據信息。

接下來準備開始搞事了,整個步驟不是必須的,只是爲了完整體驗流程。

如果想快速集成,可以直接創建Appfile,Fastfile文件,Deliverfile文件,fastlane目錄,添加配置即可。

系統環境要求:

Mac

Xcode

Gem

Ruby

安裝

Xcode命令行工具,iOS開發略過

xcode-select --install

安裝fastlane

# Using RubyGems

sudo gem install fastlane -NV

# Alternatively using Homebrew

brew cask install fastlane

初始化

切換到工程目錄

執行 fastlane init

過程中會詢問Apple ID賬號和密碼,如果有多個Team,會讓你選擇team。

據說密碼因爲是本地保存在keychina中,可以安心輸入。

提問了你的Apple ID,Team的問題之後,fastlane會自動檢測當前目錄下項目的App Name和App Identifier。如果檢測的不對,選擇n自行輸入。

因爲賬號權限問題,最終失敗。不過這個是完成的produce流程,我們的目標是上傳物料和截圖,所以繼續走deliver init。

其實這一步是可以不用執行的,只是爲了自動創建對應的配置文件Appfile/Fastfile和fastlane目錄而已,如果已經有配置,編輯正確後,是可以略過這一部分的。

拉取

首次拉取,執行 fastlane deliver init

二次拉取可以分別執行

下載截圖 fastlane deliver download_screenshots

下載元數據 fastlane deliver download_metadata

 

在執行deliver init的過程中,會同步iTC中的所有語言的元數據和截圖,並按照目錄結構組織好。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

fastlane

├── Appfile

├── Deliverfile

├── Fastfile

├── metadata

│   ├── copyright.txt

│   ├── en-US

│   │   ├── description.txt

│   │   ├── keywords.txt

│   │   ├── marketing_url.txt

│   │   ├── name.txt

│   │   ├── privacy_url.txt

│   │   ├── release_notes.txt

│   │   └── support_url.txt

│   ├── primary_category.txt

│   ├── primary_first_sub_category.txt

│   ├── primary_second_sub_category.txt

│   ├── secondary_category.txt

│   ├── secondary_first_sub_category.txt

│   ├── secondary_second_sub_category.txt

│   └── zh-Hans

│   ├── description.txt

│   ├── keywords.txt

│   ├── marketing_url.txt

│   ├── name.txt

│   ├── privacy_url.txt

│   ├── release_notes.txt

│   └── support_url.txt

└── screenshots

├── README.txt

├── en-US

│   ├── 一堆圖片

如果沒有fastlane目錄,生成的目錄是./metadata 和 ./screenshots

上一步中創建了fastlane目錄,拉取存放的路徑是./fastlane/metadata 和 ./fastlane/screenshots

  • Fastfile => 用來定義所有的lane任務Fastfile幫助
  • Appfile => 是用來存儲一些公共信息的,比如app_identifier,apple_id,team_id,itc_team_id等。Appfile幫助
  • Deliverfile => deliver的配置文件Deliverfile幫助

 

 

 

上傳

本地手動更新完本次更新的文字和圖片後,

執行 fastlane deliver 就可以完成上傳,可能有一些具體的參數需要調整。

這個部分主要是上傳元數據,截圖,同時設置了自動釋放和分階段發佈。

參數設置上是可以設置提交時的出口和IDFA的設置,所以應該是可以自動提交的,這裏還沒有進行調研。

另外截圖上傳並沒有嘗試視頻的上傳,這裏可能需要注意。

 

Deliverfile 我這邊進行了如下配置:

force(true) #跳過HTML報告文件驗證

app_version("9.0.10") #應該編輯或創建的版本,不存在會自動創建

#skip_metadata(true) # 不要上傳元數據(如標題、描述)。打開後,下面的automatic_release和phased_release等配置會無效

skip_screenshots(true) #不上傳屏幕快照

skip_binary_upload(true) #跳過上傳ipa或pkg到iTunes Connect

overwrite_screenshots(false) #在上傳新截圖之前,先清除所有之前上傳的截圖,個人覺得通常是打開,全新上傳比較好。

run_precheck_before_submit(false) #在提交應用程序審覈之前運行precheck

automatic_release(true) #一旦應用程序審覈通過,該應用會自動發佈App Store

phased_release(true) #啓用iTC的分階段發佈功能

 

結語

整體的流程還是比較簡單的的,拉取,修改,上傳,實現了我們的目標。

還有其他很多功能和配置,還在學習和研究中,歡迎大家一起交流。

據我所知,其實持續集成已經有集成了部分fastlane的功能,包括match證書管理,gym打包,上傳包等業務,這部分如果能夠集成到整個持續集成中,持續集成可以完整的自動化整個iOS開發流程。

比如:這個上傳部分,可以通過前端開發工具,生成自動的包格式,一鍵自動上傳到iTC上。

Deliver常用配置

網上copy的,具體也可以通過執行fastlane action deliver查看

Key

Description

Default

username

Apple ID的用戶名

*

app_identifier

應用程序的包標識符

*

app

你想要使用/修改的應用程序的ID

 

edit_live

修改實時元數據,此選項禁用ipa上傳和截圖上傳

false

ipa

ipa文件路徑

*

pkg

pkg文件路徑

*

platform

使用的平臺(optional)

ios

metadata_path

包含metadata文件夾的路徑,metadata中保存的appstore中你應用的具體內容介紹(如標題、描述)

 

screenshots_path

包含屏幕快照文件夾的路徑

 

skip_binary_upload

跳過上傳ipa或pkg到iTunes Connect

false

use_live_version

使用實時版本而不是編輯版本

false

skip_screenshots

不上傳屏幕快照

false

app_version

應該編輯或創建的版本

 

skip_metadata

不要上傳元數據(如標題、描述)。這仍然會上傳屏幕快照

false

skip_app_version_update

不要更新app提交的版本

false

force

跳過HTML報告文件驗證。

false

submit_for_review

在上傳所有內容後提交新版本進行審覈

false

reject_if_possible

拒絕先前提交的處於所有可能的狀態構建

false

automatic_release

一旦應用程序審覈通過,該應用會自動發佈App Store

false

auto_release_date

審覈通過後自動發佈App Store的以毫秒爲單位的日期

 

phased_release

啓用iTC的分階段發佈功能(不懂)

false

price_tier

應用程序的價格層級別

 

build_number

如果設置給定的構建號(已經上傳到iTC)將被使用代替當前構建號

 

app_rating_config_path

應用程序配置的路徑

 

submission_information

提交的額外資料(例如:第三方內容)

 

team_id

如果你在多個團隊,你的iTunes Connect團隊的ID

*

team_name

如果你在多個團隊中,你的iTunes Connect團隊的名字

*

dev_portal_team_id

如果您在多個團隊中,您的開發人員門戶團隊的短ID。不同於您的iTC團隊ID!

*

dev_portal_team_name

如果您在多個團隊中,您的開發人員門戶團隊的名稱

*

itc_provider

提供者的短名稱,用iTMSTransporter標識您的團隊。來獲得提供者的短名稱,去運行Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v。供應商的短名稱應該列在第二列

 

overwrite_screenshots

在上傳新截圖之前,先清除所有之前上傳的截圖

false

run_precheck_before_submit

在提交應用程序審覈之前運行precheck

true

precheck_default_rule_level

默認的規則級別,除非有其他配置

:warn

app_icon

Metadata(元數據):應用程序圖標的路徑。

 

apple_watch_app_icon

Metadata(元數據):蘋果手錶應用程序圖標的路徑。

 

copyright

Metadata(元數據):版權公告

 

primary_category

Metadata(元數據):主要類別的英文名稱(如商業、書籍)

 

secondary_category

Metadata(元數據):次級類別的英文名稱(如商業、書籍)

 

primary_first_sub_category

Metadata(元數據):主要的第一個子類別的英文名(如教育、字謎)

 

primary_second_sub_category

Metadata(元數據):主要的二級類別的英文名(如教育、字謎)

 

secondary_first_sub_category

Metadata(元數據): 次級類別第一個子類別的英文名稱(如教育、字謎)

 

secondary_second_sub_category

Metadata(元數據):次級的第二子類別的英文名稱(如教育、字謎)

 

trade_representative_contact_information

Metadata(元數據):包含商務代表的聯繫信息的hash(不懂)

 

app_review_information

Metadata(元數據):包含審覈信息的hash

 

description

Metadata(元數據):應用程序描述

 

name

Metadata(元數據): 應用程序名字

 

subtitle

Metadata(元數據): 應用程序副標題

 

keywords

Metadata(元數據):一組關鍵字

 

promotional_text

Metadata(元數據): 一段促銷文字

 

release_notes

Metadata(元數據): 本版本的版本說明

 

privacy_url

Metadata(元數據):隱私的url

 

support_url

Metadata(元數據): 支持的url

 

marketing_url

Metadata(元數據): 營銷url

 

languages

Metadata(元數據):應用中使用的語言種類

 

ignore_language_directory_validation

Metadata(元數據): 應用程序名字

false

subtitle

Metadata(元數據): 應用程序副標題

true

* = 默認值依賴於用戶的系統

參考

https://docs.fastlane.tools/actions/upload_to_app_store/

https://whlsxl.github.io/fastlane1/

https://lipan.me/2016/08/25/fastlane-ios-continuous-deployment-tool.html

https://juejin.im/post/5a7b10bb6fb9a0636263bfd5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章