使用 fastlane 實現(xiàn)對 iOS Multi-Target 的一鍵打包部署

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_idteam_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 默認支持一個 target,對于這類型需求,只需要按著 fastlane 提供的官方教程學(xué)習即可,很簡單。但對于 mutil target,并且每個 target 對應(yīng)不同的開發(fā)者賬號的情況,配置起來稍微有點不同。

3.2.1 .env文件配置

fastlane init 后默認生成的文件中并沒有.env 文件。此文件的作用理解起來很簡單,說白了就是自定義臨時變量,供 Appfile, DeliverfileFastfile使用。
理解原理后,使用起來就簡單了,就是有幾個 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 默認不顯示隱藏文件,創(chuàng)建 .env 文件后,若需查看,需要執(zhí)行兩條命令來開啟隱藏文件的顯示:

$ defaults write com.apple.finder AppleShowAllFiles -boolean true;
$ killall Finder

4.2 等待輸入密碼時崩潰退出

fastlane 在等待密碼輸入時貌似不大穩(wěn)定,有50%以上機會崩潰,所以,建議把密碼寫到.env 文件中。

4.3 版本修改記錄上傳不成功

  1. Deliverfile 中,通過 release_notes 來設(shè)置版本修改記錄
  2. 同時,不要設(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ì)的工作,當然是要通過工作流來實現(xiàn)它,解放雙手,節(jié)省時間多陪女票。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容