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

3.2.1 .env文件配置

fastlane init 后默認(rèn)生成的文件中并沒有.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 默認(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 版本修改記錄上傳不成功

  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ì)的工作,當(dāng)然是要通過工作流來實現(xiàn)它摧莽,解放雙手庙洼,節(jié)省時間多陪女票。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末范嘱,一起剝皮案震驚了整個濱河市送膳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丑蛤,老刑警劉巖叠聋,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異受裹,居然都是意外死亡碌补,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門棉饶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厦章,“玉大人,你說我怎么就攤上這事照藻⊥嗫校” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵幸缕,是天一觀的道長群发。 經(jīng)常有香客問我,道長发乔,這世上最難降的妖魔是什么熟妓? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮栏尚,結(jié)果婚禮上起愈,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好抬虽,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布官觅。 她就那樣靜靜地躺著,像睡著了一般阐污。 火紅的嫁衣襯著肌膚如雪缰猴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天疤剑,我揣著相機與錄音,去河邊找鬼闷堡。 笑死隘膘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杠览。 我是一名探鬼主播弯菊,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼踱阿!你這毒婦竟也來了管钳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤软舌,失蹤者是張志新(化名)和其女友劉穎才漆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佛点,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡醇滥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了超营。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸳玩。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖演闭,靈堂內(nèi)的尸體忽然破棺而出不跟,到底是詐尸還是另有隱情,我是刑警寧澤米碰,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布窝革,位于F島的核電站,受9級特大地震影響见间,放射性物質(zhì)發(fā)生泄漏聊闯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一米诉、第九天 我趴在偏房一處隱蔽的房頂上張望菱蔬。 院中可真熱鬧,春花似錦、人聲如沸拴泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚪腐。三九已至箭昵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間回季,已是汗流浹背家制。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泡一,地道東北人颤殴。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像鼻忠,于是被迫代替她去往敵國和親涵但。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容