1. 前言
iOS App 的發(fā)布流程繁瑣,網(wǎng)絡(luò)問題頻出叙身,每次發(fā)布都可以說是開發(fā)者的噩耗渔扎,如果碰到像我一樣每次都要分別發(fā)布到多個蘋果開發(fā)者賬號下的 iTunes Connect 的情況,可以說簡直就是被謀殺了一遍信轿。
幸好晃痴,最近發(fā)現(xiàn)了 fastlane 這個神器,可以將所有關(guān)于 iOS App 發(fā)布的流程配置成工作流财忽,實現(xiàn)一鍵發(fā)布倘核!
從此發(fā)布不再是噩夢。
PS:如果你的 App 只有一個 target即彪,也只需要發(fā)布到一個開發(fā)者賬號下紧唱,那么直接參考官方教程即可,很簡單隶校,容易上手漏益。
1.1 開發(fā)環(huán)境
- macOS Sierra : 10.12.3 (16D32)
- Xcode : 8.2.1 (8C1002)
1.2 工具
2. fastlane 簡介
fastlane 官網(wǎng)已經(jīng)講得非常清楚,fastlane 是一個關(guān)于 App 發(fā)布的工具集深胳,除了提供 iOS 發(fā)布相關(guān)工具外绰疤,也支持 Android App 發(fā)布。根據(jù)官網(wǎng)顯示舞终,目前已經(jīng)為開發(fā)者節(jié)省了6158597 個小時轻庆,被譽為開發(fā)者的救星也不為過癣猾。
3. 實現(xiàn)步驟
3.1 fastlane 初始化
首先安裝 fastlane(若安裝失敗,fastlane 主頁提供另外兩種安裝方式)
$ sudo gem install fastlane -NV
在 xcode 工程目錄下余爆,執(zhí)行
$ fastlane init
執(zhí)行過程中纷宇,會提示輸入蘋果賬號密碼,自動下載 App 元數(shù)據(jù)等信息蛾方,由于我們的 xcode 工程中使用的是 mutil target像捶,但 fastlane init 只能處理一個 target 的信息,所以我們按照提示輸入任意一個 target 的相關(guān)信息就行了转捕,后面通過修改配置文件來實現(xiàn) mutil target 的支持作岖。
fastlane 初始化完成后,會在 xcode 目錄下自動生成以下文件:
- metadata 目錄:存放 App 元數(shù)據(jù)五芝,包括 App 簡介痘儡,Icon,Copyright 等
- screenshots 目錄:顧名思義枢步,存放 App store 中的截圖
- Appfile:用于指定
app_identifier
,apple_id
,team_id
沉删;本文中每個 target 都有自己的app_identifier
,apple_id
和team_id
- Deliverfile:用于指定跟 App 版本發(fā)布相關(guān)的信息,除了
apple_identifier
外醉途,還包括submit_for_review
,automatic_release
等可配置項矾瑰,基本覆蓋 iTunes Connect 里面的所有選項 - Fastfile:用于編寫邏輯腳本,使用 ruby 語言隘擎,例如首先執(zhí)行 cocoapods 更新第三方依賴庫殴穴,然后執(zhí)行 pem 更新相關(guān)證書,接著通過 gym 來編譯并打包 ipa 文件货葬,最后通過 deliver 發(fā)布到 iTunes Connect 中采幌,并提交審核。具體邏輯按照開發(fā)者需求自行設(shè)計震桶。
3.2 配置文件修改
fastlane 默認(rèn)支持一個 target休傍,對于這類型需求,只需要按著 fastlane 提供的官方教程學(xué)習(xí)即可蹲姐,很簡單磨取。但對于 mutil target,并且每個 target 對應(yīng)不同的開發(fā)者賬號的情況柴墩,配置起來稍微有點不同忙厌。
3.2.1 .env
文件配置
fastlane init 后默認(rèn)生成的文件中并沒有.env 文件。此文件的作用理解起來很簡單江咳,說白了就是自定義臨時變量逢净,供 Appfile
, Deliverfile
和 Fastfile
使用。
理解原理后,使用起來就簡單了汹胃,就是有幾個 target,就創(chuàng)建幾個.env 文件东臀,提供不同的變量值着饥,供不同 target 編譯打包上傳時使用。
例如惰赋,針對 target A 和 target B宰掉,分別創(chuàng)建 .env.targetA 和 .env.targetB 兩個文件,內(nèi)容分別是
其他配置文件可通過 ENV['APP_IDENTIFIER']
來讀取變量值
$ app_identifier ENV['APP_IDENTIFIER']
fastlane 調(diào)用時赁濒,通過添加參數(shù) --env
來指定待讀取的 .env
文件
$ fastlane release --env targetA
$ fastlane release --env targerB
3.2.2 Appfile
配置
創(chuàng)建完所有 target 的 .env
文件后轨奄,Appfile
的設(shè)置就變得很簡單了
# The bundle identifier of your app
app_identifier ENV['APP_IDENTIFIER']
# Your Apple email address
apple_id ENV['APPLE_ID']
# Developer Portal Team ID
team_id ENV['TEAM_ID']
3.2.3 Deliverfile
配置
由于涉及到 iTunes Connect 中所有可配置項,Deliverfile
的配置項有點多拒炎,具體可查看官網(wǎng)說明挪拟。這里我們對一些常用的配置進行修改:
# The bundle identifier of your app
app_identifier ENV['APP_IDENTIFIER']
# your Apple ID user
username ENV['APPLE_ID']
# 元數(shù)據(jù)的路徑
metadata_path ENV['METADATA_PATH']
screenshots_path ENV['SCREENSHOTS_PATH']
#App store 中待發(fā)布的 App 版本,若每個 target 的版本號不同击你,可以通過.env 文件來分別定義
app_version "3.3"
#下載 metadata 及 screenshots 時直接覆蓋玉组,不詢問
force true
#不覆蓋 iTunes Connect原有截圖
skip_screenshots true
#自動提交審核
submit_for_review true
#審核通過后立刻發(fā)布
automatic_release true
#新版本修改記錄
release_notes({
"en-US" => "1) upgrade test line 1\n2) upgreade test line 2",
"zh-Hans" => "1) 升級測試第一行\(zhòng)n2) 升級測試第二行"
})
#App 加密算法使用情況及廣告相關(guān)配置
submission_information({
#Export Compliance
export_compliance_available_on_french_store: "false",
export_compliance_contains_proprietary_cryptography: "false",
export_compliance_contains_third_party_cryptography: "false",
export_compliance_is_exempt: "false",
export_compliance_uses_encryption: "false",
export_compliance_app_type: nil,
export_compliance_encryption_updated: "false",
export_compliance_compliance_required: "false",
export_compliance_platform: "ios",
content_rights_contains_third_party_content: "false",
content_rights_has_rights: "false",
#Advertising Identifier
add_id_info_limits_tracking: "false",
add_id_info_serves_ads: "false",
add_id_info_tracks_action: "false",
add_id_info_tracks_install: "false",
add_id_info_uses_idfa: "false"
});
3.2.4 Fastfile
配置
在對 Fastfile
進行配置前,我們先了解下 lane
.
lane
可以理解為 fastlane 的執(zhí)行腳本丁侄,一個Fastfile
里可以編寫任意個lane
惯雳,每個lane
都可以獨立運行,也可以嵌套運行鸿摇。話不多說石景,直接上代碼:
首先,編寫一個編譯并上傳到 iTunes Connect 的 lane
拙吉,名稱為 deploy.
desc "Deploy one target"
lane : deploy do
gym(scheme: ENV('SCHEME_NAME'], silent: true)
deliver
end
然后潮孽,編寫另外一個lane
,名稱為 deploy_all, 用于編譯并上傳所有 target.
desc "Deploy multi targets"
lane :deploy_all do
cocoapods
sh "fastlane deploy --env targetA"
sh "fastlane deploy --env targetB"
最后庐镐,只需要在 xcode 工程目錄下執(zhí)行
fastlane deploy_all
即可實現(xiàn) iOS App Multi targets 的一鍵編譯打包并上傳恩商。
4. 坑!
4.1 .env 為隱藏文件
Finder 默認(rèn)不顯示隱藏文件必逆,創(chuàng)建 .env 文件后怠堪,若需查看,需要執(zhí)行兩條命令來開啟隱藏文件的顯示:
$ defaults write com.apple.finder AppleShowAllFiles -boolean true;
$ killall Finder
4.2 等待輸入密碼時崩潰退出
fastlane 在等待密碼輸入時貌似不大穩(wěn)定名眉,有50%以上機會崩潰粟矿,所以,建議把密碼寫到.env 文件中损拢。
4.3 版本修改記錄上傳不成功
- 在
Deliverfile
中陌粹,通過release_notes
來設(shè)置版本修改記錄 - 同時,不要設(shè)置
skip_metadata
選項
#新版本修改記錄
release_notes({
"en-US" => "1) 升級測試\n2) 升級測試第二行",
"zh-Hans" => "1) 升級測試\n2) 升級測試第二行"
})
4.4 自動提交審核的原理
通常開發(fā)者上傳 .ipa 文件到 iTunes Connect 后福压,需要等待一段時間后才能選擇新上傳的 build掏秩,然后才能提交審核或舞。那么 fastlane 是如何做到自動提交審核的呢?答案就是蒙幻,等待映凳,并且每分鐘檢查一遍 build 是否就緒。
5. 總結(jié)
蘋果把 App 發(fā)布流程設(shè)置得如此反人類邮破,雖說是有它的道理與作用诈豌,作為開發(fā)者也只能遵循。不過「道高一尺魔高一丈」抒和,作為一名程序猿矫渔,對于這種「重復(fù)體力投入」性質(zhì)的工作,當(dāng)然是要通過工作流來實現(xiàn)它摧莽,解放雙手庙洼,節(jié)省時間多陪女票。