常用命令:
fastlane actions: 展示所有有效action列表
fastlane action [action_name]: 展示一個(gè)action的詳細(xì)說明,使用方法等
fastlane lanes: 展示fastfile中的所有l(wèi)ane
fastlane list: 展示fastfile中的所有的有效的lane
fastlane new_action: 創(chuàng)建一個(gè)新的action
fastlane env: 打印fastlane、ruby環(huán)境,一般提bug到issue的時(shí)候會(huì)要求提供
生命周期:
| 執(zhí)行順序 | 方法名 | 說明 |
|---|---|---|
| 1 | before_all | 在執(zhí)行 lane 之前只執(zhí)行一次 |
| 2 | before_each | 每次執(zhí)行 lane 之前都會(huì)執(zhí)行一次 |
| 3 | lane | 自定義的任務(wù) |
| 4 | after_each | 每次執(zhí)行 lane 之后都會(huì)執(zhí)行一次 |
| 5 | after_all | 在執(zhí)行 lane 成功結(jié)束之后執(zhí)行一次 |
| 6 | error | 在執(zhí)行上述情況任意環(huán)境報(bào)錯(cuò)都會(huì)中止并執(zhí)行一次 |
Sigh
如果你不確定證書目前是否可用,可以用Sigh自動(dòng)生成獲取證書。Sigh會(huì)自動(dòng)根據(jù)Appfile里設(shè)置的app_identifier從ADC(蘋果開發(fā)者中心)生成證書,并下載到項(xiàng)目根目錄下(不是fastlane目錄),下載后自動(dòng)安裝。你可以通過指定output_path指定證書下載位置。
PS:建議不要把這個(gè)文件夾同步到項(xiàng)目的git中(Fastlane提供了match專門管理所有證書)??梢栽?gitignore中可以忽略這個(gè)文件夾。
Sigh常用的配置項(xiàng):
| Name | Type | Description | Default |
|---|---|---|---|
| adhoc | bool | 獲取adhoc證書 | fasle |
| development | bool | 更新開發(fā)證書,不更新production證書 |
false |
| force | bool | 強(qiáng)制更新證書,不管證書是否在ADC中存在 | false |
iOS里code打包證書有4種,adhoc,inhouse,appstore,development證書。
| 價(jià)格 | AppStore證書 | In-House證書 | AdHoc證書 | Development證書 | |
|---|---|---|---|---|---|
| 企業(yè)帳戶 | $299 | √ | √ | √ | |
| 公司賬號(hào) | $99 | √ | √ | √ | |
| 個(gè)人賬戶 | $99 | √ | √ | √ |
其中In-House的方式打包的ipa安裝沒有設(shè)備的限制。AdHoc打包的ipa必須提前把設(shè)備的UDID添加到證書中,并且有100臺(tái)設(shè)備限制。
所以如果你不指定adhoc為true,Sigh會(huì)識(shí)別帳戶類型,企業(yè)帳戶默認(rèn)生成In-House證書,公司賬號(hào)和個(gè)人帳戶默認(rèn)生成AppStore證書。
Gym
Gym常用配置項(xiàng):
| Name | Type | Description | Default |
|---|---|---|---|
| scheme | string | 指定需要編譯的scheme | |
| clean | bool | 是否在編譯前clean | false |
| output_directory | string | 導(dǎo)出目錄 | ./ |
| output_name | string | 導(dǎo)出ipa名字 | [app_name].ipa |
| export_options | hash/string | 這里指定Xcode API的外部配置文件地址,或者配置hash,見下文 | |
| export_method | string | 打包方式,可選項(xiàng)app-store ad-hoc package``enterprise``development``developer-id
|
如果在fastlane中使用了sigh,這個(gè)值會(huì)從上下文獲取 |
| include_bitcode | bool | 是否開啟bitcode
|
Xcode API 默認(rèn)值為true |
| include_symbols | bool | 是否生成符號(hào)表 | Xcode API 默認(rèn)值為true |
Xcode7之后,Xcode API允許我們指定一個(gè)plist文件作為額外的配置文件。gym默認(rèn)會(huì)幫你創(chuàng)建這個(gè)文件,你可以直接指定配置。更多關(guān)于plist可配置項(xiàng),執(zhí)行xcodebuild -help查看Available keys for -exportOptionsPlist。
export_method, include_symbols,和include_bitcode 這些參數(shù)都是exportOptionsPlist的配置,對(duì)應(yīng)method,uploadSymbols和uploadBitcode。
Gym可以指定配置文件Gymfile。 初始化:
gym init
Firim
Fir.im是一個(gè)ipa托管網(wǎng)站。你可以用AdHoc或者In-House的方式打包,上傳到fir.im發(fā)送給測(cè)試人員測(cè)試。需要先注冊(cè)Fir.im帳戶,并生成Token。這種方式適合:
- 小團(tuán)隊(duì) => 測(cè)試的機(jī)器數(shù)量很少并且非??煽?。直接連上開發(fā)機(jī),真機(jī)調(diào)試一次,就可以添加
- 土豪 => 有企業(yè)帳戶可以打
In-House的包
Firim常用配置項(xiàng):
| Name | Type | Description | Default |
|---|---|---|---|
| firim_api_token | string | 指定fir.im的token
|
|
| ipa | string |
ipa地址 |
如果使用gym,可以通過上下文獲取 |
| icon | string | icon的path,注意這里有個(gè)非??拥牡胤剑琭ir.im只支持jpg格式的圖片 |
還有項(xiàng)如app_name等等,是用來配置fir.im頁面屬性的。firim --help
Firim的配置文件是Firimfile。初始化:
firim init
Firim是我完全仿照fastlane組件的方式寫的,所以也可以單獨(dú)作為CLI使用。
Deliver
Deliver可以完全管理與iTC的交互。其中包括:
- 上傳和下載多語言截圖
- 上傳和下載多語言元數(shù)據(jù)
- 上傳二進(jìn)制文件
還記得上面初始化的時(shí)候初始化的metadata,screenshots目錄么?iTC中的所有的元數(shù)據(jù)信息都被保存在metadata中,所有的截圖信息都被保存在screenshots中。
metadata:
- 可以很容易的管理對(duì)應(yīng)目錄下的文件和iTC后臺(tái)的表單項(xiàng),在執(zhí)行
deliver時(shí)會(huì)自動(dòng)被傳到iTC。 - 在
metadata目錄下的文件,如copyright.txt,是沒有本地化的,在二層目錄中的文件都是需要對(duì)應(yīng)不同語言的表單項(xiàng)。 - 如果你不想修改某些項(xiàng)的信息,直接把對(duì)應(yīng)的文件刪除即可。
- 所有這些表單項(xiàng)也可以在
Deliverfile中指定,Deliverfile中指定的項(xiàng)優(yōu)先級(jí)比文件高
screenshots:
- 如果不想更改截圖,可以把整個(gè)截圖目錄刪除
- 如果不使用
snapshot(自動(dòng)化截圖),也可以自己截圖放到對(duì)應(yīng)目錄下,比一張一張上傳iTC快的多。截圖在iTC中的排列順序就是本地文件名的「字母表順序」(在目錄中右擊,按文件名排序)。deliver會(huì)識(shí)別圖片分辨率,上傳到對(duì)應(yīng)設(shè)備中。
如果要通過deliver修改元數(shù)據(jù)或截圖,你必須提供所有iTC后臺(tái)中有的語言。比如后臺(tái)中有「簡(jiǎn)體中文」和「英文」,你也必須提供對(duì)應(yīng)的zh-Hans和en-US文件,否則deliver會(huì)報(bào)缺少語言的錯(cuò)誤??梢栽趇TC后臺(tái)提交的版本中刪除語言。
Deliver常用配置項(xiàng):
| Name | Type | Description | Default |
|---|---|---|---|
| ipa | string |
ipa地址 |
如果使用gym,可以通過上下文獲取 |
| metadata_path | string | 指定metadata目錄地址 |
如果在fastlane中./fastlane/metadata,如果作為獨(dú)立的命令行應(yīng)用./metadata
|
| screenshots_path | string | 指定screenshots目錄地址 |
如果在fastlane中./fastlane/screenshots,如果作為獨(dú)立的命令行應(yīng)用./screenshots
|
| skip_binary_upload | bool | 跳過二進(jìn)制文件上傳,適用于只想改metadata
|
false |
| skip_screenshots | bool | 跳過截圖上傳,如果截圖沒有變化,開啟這項(xiàng)節(jié)約時(shí)間 | false |
| skip_metadata | bool | 跳過元數(shù)據(jù)上傳 | false |
| force | bool |
deliver會(huì)在上傳時(shí)匯總信息生成HTML也,等待你審核。跳過這項(xiàng)審核此項(xiàng)設(shè)為true
|
false |
| submit_for_review | bool | 上傳完成是否自動(dòng)提交審核 | false |
| automatic_release | bool | 審核通過是否自動(dòng)釋放 | false |
| price_tier | int | App價(jià)格級(jí)別。注意:這項(xiàng)提交當(dāng)時(shí)就會(huì)生效,所以更改價(jià)格還是在后天手動(dòng)操作 | |
| submission_information | hash | 這是在iTC上點(diǎn)擊提交之后的問答表格,可選項(xiàng) | |
| app_review_information | hash | 提供審核時(shí)的信息,詳情 | |
| app_icon | string | 指定icon圖片地址,必須為png格式 |
-
submission_information =>
前綴
export_compliance=> 對(duì)應(yīng)「出口合規(guī)信息」,沒有特殊情況都選false就可以。前綴
content_rights=> 問你是否包含,顯示,訪問第三方內(nèi)容(這項(xiàng)我沒在我提交過程中找到),沒有特殊情況也都選false就可以。-
前綴
add_id_info=> 可就關(guān)鍵了,對(duì)應(yīng)「廣告標(biāo)識(shí)符」,如果你在App中使用了IDFA。你必須在這給個(gè)理由,而不能直接選false。下圖等價(jià)下表,App中投放了廣告。
[submission_information
submission_information({
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",
add_id_info_limits_tracking: "true",
add_id_info_serves_ads: "true",
add_id_info_tracks_action: "false",
add_id_info_tracks_install: "false",
add_id_info_uses_idfa: "true"
deliver的CLI工具:
- 下載iTC上的截圖
deliver download_screenshots - 下載iTC上的元數(shù)據(jù)
deliver download_metadata
發(fā)布到App Store
lane :deploy do
# 如果你用 pod install
cocoapods
# 不帶adhoc參數(shù),sigh會(huì)自動(dòng)生成App Store證書(公司或個(gè)人帳戶)
sigh
increment_build_number_in_plist(target: [target_name])
increment_version_number_in_plist(
target: [target_name],
version_number: '7.1.3'
)
# 指定輸出目錄
gym(
output_directory: './build',
)
# 上傳所有信息到App Store
deliver(force: true)
end
appicon插件
fastlane add_plugin appicon
可能會(huì)報(bào)以下錯(cuò)誤ImageMagick/GraphicsMagick is not installed
- 安裝GraphicsMagick:
brew install graphicsmagick
- 卸載
brew uninstall imagemagick graphicsmagick libpng jpeg
brew cleanup -s
多scheme寫法
platform :ios do #指定持續(xù)集成對(duì)象的平臺(tái)名稱
lane :dev do|options| #給lane命名
branch = options[:branch]
#這里我們項(xiàng)目為了區(qū)分線上環(huán)境和測(cè)試環(huán)境,而做了兩個(gè)target
#關(guān)于target區(qū)分環(huán)境的方法,可以參考我同事的簡(jiǎn)書文章http://www.itdecent.cn/p/23cc84d40423
#下面代碼通過在終端輸入1或者其他數(shù)字來選擇要打包的target
#puts是ruby中的輸出,gets為獲取終端中輸入的文字,gets需要指定STDIN包中的gets方法,否則會(huì)識(shí)別為其他包中的gets方法,具體為什么我也不知道
puts "請(qǐng)選擇要打的scheme:(1:項(xiàng)目Target1,else: 項(xiàng)目Target2)"
scheme = STDIN.gets
# 通過判斷輸入內(nèi)容,來區(qū)分一些打包信息,1后面加\n是因?yàn)樵诮K端輸入1再敲回車的時(shí)候scheme就包含了回車的內(nèi)容,所以scheme == "1\n"
if scheme == "1\n"
#項(xiàng)目中target的名稱,以QQ為例,如果我的target叫QQ,則下面填寫QQ,如果是wechat,就填wechat
schemeName = "項(xiàng)目Target1"
#打包的用途,也就是app-store, package, ad-hoc, enterprise, development這幾個(gè)中的一個(gè),這里我們項(xiàng)目的target1用的是公司帳號(hào),打的是開發(fā)包
export_method = "development"
else
schemeName = "項(xiàng)目Target2"
#這里我們項(xiàng)目的target2用的是企業(yè)帳號(hào),打的是企業(yè)包
export_method = "enterprise"
end
#從蒲公英平臺(tái)拿到的api_key和user_key,下面我會(huì)講怎么拿到這兩個(gè)key,存在下面兩個(gè)變量中
api_key = "xxxxxxxxxxxxxxxxxxx"
user_key = "xxxxxxxxxxxxxxxxxxx"
#輸入蒲公英上傳ipa包后輸入的版本描述信息
puts "請(qǐng)輸入版本描述:"
desc = STDIN.gets
puts "開始打包 #{schemeName}"
# 開始打包
gym(
#指定scheme的名字
scheme: "#{schemeName}",
#輸出的ipa名稱
output_name:"#{schemeName}",
# 是否清空以前的編譯信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的輸出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"#{export_method}",
# 指定輸出文件夾,這里會(huì)保存我們最后生成的ipa文件,也就是存到了我們上面提到的fastlane文件夾中的build文件夾中
output_directory:"./fastlane/build",
)
puts "開始上傳到蒲公英"
#開始上傳ipa到蒲公英,這里用的是蒲公英提供的插件
#update_description代表更新信息,password代表安裝密碼
pgyer(update_description: "#{desc}", api_key: "#{api_key}", user_key: "#{user_key}", password: "1111", install_type: "2")
#在上傳完ipa后,打開ipa的存放文件夾,起到提示上傳完成的作用
system "open ../fastlane/build"
end
end
