以前一直做持續(xù)發(fā)布使用xcbuild和xctool這些工作進(jìn)行打包,但是經(jīng)常遇到證書相關(guān)的問題桨螺,各種Provising Profile文件匹配不上私痹,然后又證書不匹配等等。于是開始尋求新的解決方案晃酒,找到了新的神器fastlane。
相關(guān)信息
fastlane是一整套的工具幫助開發(fā)者主要是iOS開發(fā)者立砸,打包App上傳App到App store或著TestFlight掖疮。
fastlane的官方repo地址:
https://github.com/fastlane/fastlane
fastlane的快速上手文檔:
https://docs.fastlane.tools/
fastlane支持的action文檔
https://docs.fastlane.tools/actions/
安裝fastlane
1.確保xcode命令行工具已經(jīng)安裝
```xcode-select --install`
``
2.參考官方文檔有三種安裝方式任選一種進(jìn)行安裝
使用fastlane進(jìn)行打包
1.初始化項(xiàng)目 fastlane init
使用fastlane必須要先對(duì)項(xiàng)目進(jìn)行初始化fastlane init
a.使用命令行工具進(jìn)入項(xiàng)目目錄執(zhí)行fastlane init
命令
初始化的過程中會(huì)需要填寫一些項(xiàng)目信息包括scheme name和你的Apple id等等初茶。同時(shí)會(huì)在項(xiàng)目中生成一個(gè)fastlane的文件夾颗祝。
2.查看fastlane文件夾中的內(nèi)容
上面已經(jīng)說到初始化之后浊闪,在項(xiàng)目根目錄會(huì)生成一個(gè)fastlane的文件夾,接著打開文件夾看一看
文件夾里一共有4個(gè)文件
- Appfile里面存放了App的基本信息包括app_identifier螺戳、apple_id搁宾、team_id等等。如果在第一步init的時(shí)候你輸入了正確的appId賬號(hào)和密碼會(huì)在這里生成正確的team_id信息倔幼。
- Fastfile是最重要的一個(gè)文件盖腿,可以編寫和定制我們打包腳本的一個(gè)文件,我們自定義的一些功能就寫在這里损同。
- README.md里面是一些幫助說明信息
- report.xml就不用管了
Fastfile
下面貼一下Fastfile中的內(nèi)容
前面幾行記錄了fastlane的版本信息
從
platform :ios do
開始下面的就是fastlane可以執(zhí)行的任務(wù)第一個(gè)
before_all do
cocoapods
end
這個(gè)點(diǎn)意思是在執(zhí)行每一個(gè)lane之前都先執(zhí)行這個(gè)功能翩腐,它里面其實(shí)就跑了一個(gè)fastlane的action這個(gè)action叫cocoapods
。
3.1查看fastlane的action以及action的用法
上面提到before_all
中其實(shí)就是執(zhí)行了一個(gè)action那么讓我們來看看fastlane一共有哪些action膏燃,以及action怎么用
在命令行中使用fastlane actions
可以列出所有的action茂卦,使用fastlane action [action的名字]
可以查看該action的相關(guān)信息,最重要的是在幫助文檔中的這里可以查看具體action的使用方法和示列https://docs.fastlane.tools/actions/.
列出所有action
查看某個(gè)action的說明
網(wǎng)頁文檔中關(guān)于cocoapods這個(gè)action的說明:
3.編寫自己的lane
知道了action和lane之后组哩,我們回到Fastfile文件中等龙,看看其實(shí)在生成的文件中已經(jīng)幫我們寫了好幾個(gè)lane了
desc "Runs all the tests"
lane :test do
scan
end
desc "Submit a new Beta Build to Apple TestFlight"
desc "This will also make sure the profile is up to date"
lane :beta do
# match(type: "appstore") # more information: https://codesigning.guide
gym # Build your app - more options available
pilot
# sh "your_script.sh"
# You can also use other beta testing services here (run `fastlane actions`)
end
上面有2個(gè)lane,一個(gè)叫test 一個(gè)叫beta伶贰,test中執(zhí)行了scan這個(gè)action蛛砰,這就是用來運(yùn)行單元測(cè)試的一個(gè)action,具體信息可以使用fastlane action scan
查看黍衙,然后beta這個(gè)lane執(zhí)行了gym和pilot泥畅,gym是打包,pilot是把應(yīng)用發(fā)到TestFlight琅翻,具體使用方法一定要去查看文檔哦涯捻。
但是生成的這些lane可能不滿足我們的需求,下面以一個(gè)企業(yè)版應(yīng)用打包為例我們自己新建一個(gè)lane:
desc "打包成企業(yè)版ipa"
lane :inhouse do |options|
#更新info plist文件 ENV["key"]表示從環(huán)境變量中讀取值望迎,也可以直接寫死障癌,如果要在打包時(shí)改變某些參數(shù),可以把它們?cè)O(shè)置成環(huán)境變量
update_info_plist(
plist_path: "GoodFolks/info.plist",
display_name: "新App名字",
)
#更新urlType 具體用法查詢action文件update_info_plist的說明
update_info_plist(
xcodeproj: "GoodFolks.xcodeproj",
plist_path: "GoodFolks/info.plist",
block: lambda { |plist|
#這里我在更新微信的urlType 這個(gè)action還可以更新app的bundleid 具體可以查閱文檔
urlScheme = plist["CFBundleURLTypes"].find{|scheme| scheme["CFBundleURLName"] == "weixin"}
urlScheme[:CFBundleURLSchemes] = ENV["app_urlschems_weixin"]
}
)
#設(shè)置版本號(hào)
increment_version_number(
version_number: ENV["app_versionName"]
)
#設(shè)置build號(hào)辩尊,這些都可以寫死涛浙,也可以不要這些action,也可以從環(huán)境變量中獲取值
increment_build_number(
build_number: ENV["app_versionCode"]
)
#這個(gè)action很重要cert就是下載和安裝匹配的Provision Profile文件摄欲,不用你去管那些證書不匹配的事情啦轿亮,下載的文件會(huì)存在項(xiàng)目根目錄的build文件夾下
cert(output_path:"build")
#這一步就是簽名了
sigh(
app_identifier: ENV["app_applicationId"],
team_id:"9M8CTWAV8P",
output_path: "build"
)
#最后就是打包,企業(yè)版打包胸墙,打包完成后會(huì)在項(xiàng)目根目錄的build文件夾下生成ipa文件
gym(
scheme: "GoodFolks",
export_method: "enterprise",
output_directory: "build",
include_bitcode: false
)
# do some other stuff here
end
4.起飛
上面說了這么多我注,但是怎么運(yùn)行呢?
很簡(jiǎn)單在你的項(xiàng)目根目錄執(zhí)行fastlane [lane的名字]
比如我們上面自己寫的一個(gè)fastlane inhouse
迟隅,fastlane就會(huì)執(zhí)行指定的任務(wù)了但骨,然后你就可以去喝咖啡啦励七。
Tips
fastlane在打包的時(shí)候可能需要交互比如輸入你的Apple id的密碼,但是很明顯在做持續(xù)發(fā)布的時(shí)候都是自動(dòng)化的奔缠,不是交互式的shell掠抬,沒辦法人工去輸入密碼,這個(gè)只需要把你的Appleid的密碼設(shè)置成一個(gè)環(huán)境變量即可,環(huán)境變量的key為FASTLANE_PASSWORD校哎。