前言:一直有聽(tīng)過(guò)腳本一鍵打包審核,但是自己一直沒(méi)在意。在微信公眾號(hào)看到ios一鍵打包的文章,突然想想自己每次從打包到提交審核(大約都是30分鐘)。自己浪費(fèi)了多少時(shí)間啊!
腳本打包方式有很多,我看中了fastlane(ios,Android都支持),github地址:
https://github.com/fastlane/fastlane 文檔地址:https://docs.fastlane.tools/
原因是看了星星:21201多星星。3247個(gè)fork,所以大量的開(kāi)發(fā)者信任并一起維護(hù)他。
搬運(yùn):http://www.code4app.com/home.php?mod=space&uid=363485&do=blog&quickforward=1&id=1856
并自己添加遇到的問(wèn)題,并解決。(原文章作者用了3天的時(shí)間搞清楚,我用了1天理解了作者的做法,作者的教程有挺多問(wèn)題 沒(méi)有指出說(shuō)明,所以我還浪費(fèi)了1天去解決所謂不清楚的問(wèn)題)。
相信您能通過(guò)此篇快速一鍵打包審核。
搬運(yùn),完善,整理。
安裝:
Installing fastlane
Make sure you have the latest version of the Xcode command line tools installed:
xcode-select --install
Install fastlane using
sudo gem install -n /usr/local/bin fastlane
or alternatively using brew cask install fastlane
Navigate to your project directory and run
fastlane init
end
安裝后具體使用:
我們?cè)谌粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到如下問(wèn)題
團(tuán)隊(duì)成員一不小心Revoke了證書(shū)導(dǎo)致所有的開(kāi)發(fā)小伙伴需要重新下載證書(shū)
每次提交App Store審核需要重復(fù)【修改證書(shū)】- 【打包】-【iTunes Connect】- 【發(fā)布】等一系列動(dòng)作
真的是不厭其煩,讓人抓狂。這個(gè)時(shí)候,幸好Fastlane來(lái)了,看他怎么來(lái)拯救我們吧。在開(kāi)始我們的教程之前,筆者先做個(gè)澄清,fastlane不是什么:
fastlane 不是一個(gè)工具,而是一系列工具的集合。比如match工具能管理證書(shū),deliver能提交APPStore審核。所以我們?cè)谑褂胒astlane的時(shí)候更多的是和它的工具集打交道。
fastlane內(nèi)部的工具不是新寫(xiě)的,而是調(diào)用mac本身的命令,只不過(guò)是實(shí)現(xiàn)了自動(dòng)化而已。比如gym工具只是xcodebuild工具的一個(gè)封裝,如果你會(huì)xcodebuild,那gym對(duì)你來(lái)說(shuō)小菜一碟。
fastlane本身沒(méi)有一套特殊語(yǔ)法,使用的Ruby語(yǔ)言,相信使用過(guò)cocoapods的同學(xué)應(yīng)該很容易上手。
安裝完fastlane并調(diào)用fastlane init
后,目錄結(jié)構(gòu)大概如下所示:
具體的安裝和初始化,本文稍后會(huì)詳細(xì)講述,先帶大家分析一下安裝后的fastlane的目錄結(jié)構(gòu)。紅色區(qū)域就是多出來(lái)的文件。本項(xiàng)目是筆者的一個(gè)APP Store上線(xiàn)項(xiàng)目,大家可以點(diǎn)擊這里獲取。
Gemfile 告訴我們fastlane 依賴(lài)的gem以及版本等其他信息。這個(gè)跟本文主題不大,筆者就不詳細(xì)描述了
fastlane文件夾里的Appfile看文件也知道,里面是關(guān)于本App的信息的;Fastfile則是fastlane的最主要的文件,在這個(gè)文件中可以編寫(xiě)我們需要使用的各個(gè)工具的順序、方式等。
這里我們先看一個(gè)已經(jīng)寫(xiě)好的fastlane的內(nèi)容:
default_platform(:ios)
platform :ios do
desc "Description of what the lane does"
lane :custom_lane do
# add actions here: https://docs.fastlane.tools/actions
match(
git_url: "https://github.com/zjh171/fastlaneProvingProfile",
type: "appstore" ,
readonly: true
)
gym(
scheme:"Wallpaper",
export_method:"app-store",
output_directory:"./build",
archive_path:"./Archive"
)
end
end
這里我們只需要關(guān)注 match 和gym這兩個(gè)工具以及括號(hào)后的內(nèi)容。match工具是我們本文開(kāi)頭描述的用于同步開(kāi)發(fā)小伙伴證書(shū)的工具,而gym則是xcodebuild工具的封裝,它指定了打包的目錄以及打包的類(lèi)型。保存該文件并執(zhí)行fastlane custom_lane
后我們可看到
這就表明我們打的App Store包已經(jīng)生成了。目錄就是我們指定的output_directory
對(duì)應(yīng)的目錄。當(dāng)然大家也不難猜想到,如果要讓fastlane實(shí)現(xiàn)自動(dòng)提交到App Store審核,還需要在gym后面加上我們需要的工具。這里先賣(mài)個(gè)關(guān)子,稍后告訴大家。下面筆者就詳細(xì)的介紹一下fastlane的使用。
安裝
執(zhí)行命令sudo gem install fastlane --verbose
即可,安裝完成后檢查一下是否安裝成功輸入fastlane --version
看是否有版本號(hào)顯示。
fix:出現(xiàn)錯(cuò)誤
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/commander
OS 10后沒(méi)權(quán)限,so改執(zhí)行
sudo gem install -n /usr/local/bin fastlane
初始化
輸入命令fastlane init
會(huì)看到如下選項(xiàng)
What would you like to use fastlane for?
1\. Automate screenshots
2\. Automate beta distribution to TestFlight
3\. Automate App Store distribution
4\. Manual setup - manually setup your project to automate your tasks
這四個(gè)選項(xiàng)的意思是
自動(dòng)截屏。這個(gè)功能能幫我們自動(dòng)截取APP中的截圖,并添加手機(jī)邊框(如果需要的話(huà)),我們這里不選擇這個(gè)選項(xiàng),因?yàn)槲覀兊捻?xiàng)目已經(jīng)有圖片了,不需要這里截屏。
自動(dòng)發(fā)布beta版本用于TestFlight,如果大家有對(duì)TestFlight不了解的,可以參考王巍寫(xiě)的這篇文章
自動(dòng)的App Store發(fā)布包。我們的目標(biāo)是要提交審核到APP Store,按道理應(yīng)該選這個(gè),但這里我們先不選,因?yàn)檫x擇了以后會(huì)需要輸入用戶(hù)名密碼,以及下載meta信息,需要花費(fèi)一定時(shí)間,這些數(shù)據(jù)我們可以后期進(jìn)行配置。
手動(dòng)設(shè)置。
選擇第四個(gè)后一路回車(chē)即可,我們會(huì)看到生成了我們熟悉的fastlane目錄,該目錄下包含了Appfile和Fastfile。我們打開(kāi)這兩個(gè)文件。
Appfile
# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app
# apple_id("[[APPLE_ID]]") # Your Apple email address
# For more information about the Appfile, see:
# https://docs.fastlane.tools/advanced/#appfile
發(fā)現(xiàn)里面沒(méi)有任何信息(“#”在ruby里是注釋?zhuān)岳锩鏇](méi)有任何信息)注釋的部分中,app_identifier
用于指定APP的bundle id
,apple_id
指的是你的AppleID。
Fastfile
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:ios)
platform :ios do
desc "Description of what the lane does"
lane :custom_lane do
# add actions here: https://docs.fastlane.tools/actions
end
end
這個(gè)文件的信息稍微多一點(diǎn),而且我們也更熟悉了,語(yǔ)法跟cocoapods很像,而且我們?cè)谖恼麻_(kāi)頭已經(jīng)稍微做了一些介紹,發(fā)現(xiàn)在lane :custom_lane do
后面是空的。其實(shí)意思也就是說(shuō),這里任何操作都沒(méi)有執(zhí)行。
fix:出現(xiàn)錯(cuò)誤 在如下卡住
[14:50:58]: $ bundle update
RubyGems 一直以來(lái)在國(guó)內(nèi)都非常難訪(fǎng)問(wèn)到,在本地你或許可以翻墻,當(dāng)你要發(fā)布上線(xiàn)的時(shí)候,你就很難搞了!
這是一個(gè)完整 RubyGems 鏡像,你可以用此代替官方版本,我們是完全基于 CDN 技術(shù)來(lái)實(shí)現(xiàn),能確保幾乎無(wú)延遲的同步。
前往: https://gems.ruby-china.com 更換源
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 確保只有 gems.ruby-china.com
運(yùn)行
雖然這是個(gè)什么都沒(méi)有做的fastlane項(xiàng)目,但其實(shí)我們可以運(yùn)行了,執(zhí)行
fastlane custom_lane
命令,我們可以看到如下輸出
fastlane detected a Gemfile in the current directory however it seems like you don't use `bundle exec` to launch fastlane faster, please use
$ bundle exec fastlane custom_lane
//此處省略多行
fastlane.tools finished successfully
大致意思就是,我們可以使用命令bundle exec fastlane custom_lane
代替fastlane custom_lane
,這樣會(huì)執(zhí)行的更快。最后的fastlane.tools finished successfully
表示執(zhí)行成功了。
打包
提交審核的前一步是打包,也是最主要的一步fastlane中有專(zhuān)門(mén)用于編譯、打包的命令gym
,我們加到lane :custom_lane do
后看看會(huì)不會(huì)有問(wèn)題。
然后執(zhí)行fastlane custom_lane
我們會(huì)收到如下提示
Select Scheme:
1\. Wallpaper
2\. AFNetworking
3\. Mangogo
4\. Masonry
5\. MJRefresh
6\. Pods-Wallpaper
?
毫無(wú)疑問(wèn)我們選擇1,其他的都是我們調(diào)用的三方庫(kù)。但聰明的讀者肯定在想,這個(gè)Scheme
是否能在fastlane
文件中就設(shè)置好,省的這里在自己選擇。是的,這就是文章開(kāi)頭提到的
gym(
scheme:"Wallpaper",
export_method:"app-store",
output_directory:"./build",
archive_path:"./Archive"
)
中scheme:"Wallpaper",
的含義。其他的參數(shù)也就不一一贅述了。讀到這里,相信大部分讀者已經(jīng)對(duì)fastlane的原理一清二楚了。其實(shí)所謂的會(huì)用fastlane也就是會(huì)用里面的各種工具而已。我相信大家選完Scheme
后還沒(méi)到打包這一步,應(yīng)該已經(jīng)出現(xiàn)了錯(cuò)誤提示,錯(cuò)誤應(yīng)該就是大家都非常熟悉的證書(shū)問(wèn)題;當(dāng)然,如果讀者夠僥幸,證書(shū)已經(jīng)設(shè)置好了,并將output_directory
、archive_path
設(shè)置好了,那就能生成對(duì)應(yīng)的對(duì)應(yīng)的IPA包。但相信成功的讀者應(yīng)該寥寥無(wú)幾,這個(gè)時(shí)候就要使出我們的大殺器match
fix:出現(xiàn)錯(cuò)誤
fastlane gym produces error: method `to_plist' not defined in Array #11503
可以參考:
https://github.com/fastlane/fastlane/issues/11503
方法終端命令:
1、rvm @global do uninstall fastlane
2、`gem install fastlane`
我測(cè)試過(guò)第二步執(zhí)行完就可以了.
3、`rvm @global do gem install fastlane`
4、rvm @global do fastlane action gym
5、`rvm @global do gem uninstall fastlane `
`rvm all do gem uninstall fastlane`
**`gem uninstall fastlane`**
6、*`gem install fastlane`*
證書(shū)管理
match:詳情教程:https://docs.microsoft.com/zh-cn/xamarin/ios/deploy-test/provisioning/fastlane/match#using
fastlane中能管理證書(shū)和簽名的工具其實(shí)還有sigh
以及cer
,那為何筆者要給大家推薦match
呢,原因已經(jīng)在文章開(kāi)頭指出了,對(duì)于多人開(kāi)發(fā)時(shí)出現(xiàn)的證書(shū)錯(cuò)亂問(wèn)題match
可以很好的處理。它將開(kāi)發(fā)人員的證書(shū)提交到一個(gè)git倉(cāng)庫(kù)進(jìn)行集中處理,在有新的成員加入開(kāi)發(fā)時(shí)候,只需要運(yùn)行一兩條命令。下面我就詳細(xì)講一下其實(shí)現(xiàn)過(guò)程吧:
1.創(chuàng)建一個(gè)倉(cāng)庫(kù)(空倉(cāng)庫(kù)或者現(xiàn)有倉(cāng)庫(kù)都可以,但建議大家使用一個(gè)空倉(cāng)庫(kù)專(zhuān)門(mén)處理證書(shū)),這里筆者的倉(cāng)庫(kù)地址是:https://github.com/zjh171/fastlaneProvingProfile
2.在終端運(yùn)行fastlane match init
可以看到需要我們輸入giturl地址,我們將地址拷進(jìn)來(lái)即可。
輸入地址后我們會(huì)看到如下提示
You can now run `fastlane match development`, `fastlane match adhoc`, `fastlane match enterprise` and `fastlane match appstore
我們按照提示生成development
和App Store
證書(shū),然后會(huì)在Xcode中發(fā)現(xiàn)生成的證書(shū)以及Provision Profile
文件。我們?cè)赬code中設(shè)置好即可。
接下來(lái),我們將match添加到fastlane文件中,如下
當(dāng)然,這個(gè)文件我們已經(jīng)在文章開(kāi)頭看過(guò)了,是不是再次感覺(jué)豁然開(kāi)朗。回到命令行,我們?cè)俅螆?zhí)行fastlane custom_lane
發(fā)現(xiàn)我們可愛(ài)的IPA包已經(jīng)打包完畢。
fix:出現(xiàn)錯(cuò)誤
[!] No matching provisioning profiles found and can not create a new one because you enabled readonly
. Check the output above for more information.
解決:
選擇工程里面的PROJECT------->build Settings --------->搜索bundleID,然后修改Product Bundle Identifier 的值為你工程的bundleID即可!
提交App Store審核
終于到了最令人激動(dòng)的提交App Store時(shí)刻了。我們要使用的工具是deliver
。聰明的你應(yīng)該已經(jīng)知道,第一步肯定是要調(diào)用fastlane deliver init
,這里會(huì)讓我們輸入APPle ID
,輸入以后就看到我們的項(xiàng)目文件夾發(fā)生了變化:
接著,我們修改一下fastfile
文件,添加deliver
,因此我們最終版的fastlane
文件是這樣的:
lane :release do
# 增加build版本號(hào)
increment_build_number
match(
git_url: "https://github.com/zjh171/fastlaneProvingProfile",
type: "appstore" ,#can be appstore,adhoc, development,enterprise
app_identifier:"cn.kyson.wallpaper",
username:"zjh171@qq.com",
readonly: true
)
# 編譯代碼
gym(
scheme:"Wallpaper",
export_method:"app-store",
)
# 發(fā)布到Apple Store
deliver
end
可以看到,大部分配置跟以前一樣,只做了lane名的改變,還有添加了increment_build_number
這一行。increment_build_number
的作用是防止本地版本的build號(hào)比App Store
(或上次)低而做的自動(dòng)增長(zhǎng)版本號(hào)的處理。當(dāng)然加了這幾句還需要在Xcode中做相應(yīng)處理:
最后在命令行中輸入fastlane release
,等待大概十幾分鐘就可以看到成功的提示了。然后我們進(jìn)入iTunes Connect
,確認(rèn)一下:
確實(shí)是已經(jīng)在審核狀態(tài)。如果大家想實(shí)現(xiàn)“一鍵審核”可以給deliver帶上參數(shù)submit_for_review
。這樣就真正實(shí)現(xiàn)了一鍵提交App Store
審核。至此,我們的一鍵打包審核流程完美收工。
注意點(diǎn)
筆者從開(kāi)始研究fastlane
到完全跑出來(lái)大概花了三天時(shí)間,期間遇到了很多問(wèn)題,走了很多彎路,總結(jié)一下,希望對(duì)讀者有一定幫助
fastlane的初始化命令是
fastlane init
,不需要加root權(quán)限,也就是sudo fastlane init
是不需要的,如果使用了sudo會(huì)對(duì)后面的各個(gè)操作造成很大影響,比如項(xiàng)目文件(workspace后project文件)會(huì)鎖定不能操作,還會(huì)引起打包失敗很多剛接觸fastlane的同學(xué)會(huì)一不注意就被fastlane上的各種命令整的暈頭轉(zhuǎn)向,例如
sync_code_signing
命令,其實(shí)是match
命令的另外一種寫(xiě)法;build_app
命令其實(shí)是gym
的別名。因此大家在學(xué)習(xí)fastlane的時(shí)候只需要學(xué)習(xí)本文介紹的命令,大部分情況下已經(jīng)夠用。如果對(duì)一個(gè)命令的用法不熟悉,可以通過(guò)fastlane action
查找,例如fastlane action match
。