Fastlane簡(jiǎn)介
Fastlane 是用Ruby語(yǔ)言編寫(xiě)的一套自動(dòng)化工具集和框架有勾,每一個(gè)工具實(shí)際都對(duì)應(yīng)一個(gè)Ruby腳本,用來(lái)執(zhí)行某一個(gè)特定的任務(wù)。Fastlane的強(qiáng)大之處虱岂,就是可以將不同的工具action有機(jī)而靈活的結(jié)合在一起,從而形成一個(gè)完整的自動(dòng)化流程菠红,大大提高了日常的開(kāi)發(fā)測(cè)試效率第岖,推薦大家使用。
背景&現(xiàn)象
公司項(xiàng)目日常開(kāi)發(fā)中试溯,已經(jīng)使用了fastlane蔑滓,配合gitlab一起實(shí)現(xiàn)自動(dòng)打包以及分發(fā),使用期間感覺(jué)很順暢遇绞,沒(méi)有出過(guò)什么問(wèn)題键袱。但是,自從Xcode升級(jí)到Xcode9正式版之后打包一直出問(wèn)題摹闽,打不了包蹄咖。
環(huán)境配置
fastlane版本: 2.59.0
| Key | Value |
| --------------------------- | ------------------------------------------- |
| OS | 10.13 |
| Ruby | 2.3.3 |
| Bundler? | false |
| Git | git version 2.13.5 (Apple Git-94) |
| Installation Source | ~/.rvm/gems/ruby-2.3.3/bin/fastlane |
| Host | Mac OS X 10.13 (17A365) |
| Ruby Lib Dir | ~/.rvm/rubies/ruby-2.3.3/lib |
| OpenSSL Version | OpenSSL 1.0.2k 26 Jan 2017 |
| Is contained | false |
| Is homebrew | false |
| Is installed via Fabric.app | false |
| Xcode Path | /Applications/Xcode.app/Contents/Developer/ |
| Xcode Version | 9.0 |
*generated on:* **2017-09-30**
工程項(xiàng)目中 provisioning profile(以下簡(jiǎn)稱(chēng)pp文件),靈活運(yùn)用了match這個(gè)action外加手動(dòng)配置付鹿。
錯(cuò)誤描述:
看到了框框的那句話(huà)澜汤,剛開(kāi)始以為是推送證書(shū)或者是provisioning profile的問(wèn)題铝量,然后手動(dòng)在此執(zhí)行了match,把證書(shū)什么的里里外外更新了一遍银亲,發(fā)現(xiàn)還是不起作用。沒(méi)辦法纽匙,只能翻看github 看看issue务蝠,看看有木有類(lèi)似的處理方案。
原因
所以說(shuō)烛缔,在執(zhí)行xcode -exportArchive的時(shí)候馏段,因?yàn)闄?quán)限訪(fǎng)問(wèn)鑰匙串,所以無(wú)法讀取到項(xiàng)目工程里的pp文件践瓷,進(jìn)而打包失敗院喜,并且報(bào)錯(cuò)說(shuō)缺少pp文件。
所以解決方法晕翠,在你的fastfile里gym action加入 allowProvisioningUpdates
gym(
scheme: scheme,
export_method: "ad-hoc",
silent:true,
output_directory:outputDirectory,
output_name:ipaName,
archive_path:outputDirectory,
export_xcargs: "-allowProvisioningUpdates",
)
保存喷舀,再執(zhí)行一次打包命令,請(qǐng)注意淋肾,這個(gè)時(shí)候xcode會(huì)彈窗讓你確認(rèn)硫麻,點(diǎn)一直允許
就是了。特別注意的是樊卓,如果和我們公司一樣的環(huán)境拿愧,那么那臺(tái)遠(yuǎn)程打包的服務(wù)器,在更新完fastfile第一次跑的時(shí)候碌尔,要遠(yuǎn)程連接上去手動(dòng)點(diǎn)擊確認(rèn)框浇辜,不然打包腳本就會(huì)一直卡在那里。
到此為止唾戚,Xcode9讀取鑰匙串權(quán)限的問(wèn)題就結(jié)束了柳洋。
但是,你以為這樣就結(jié)束了嗎颈走?就能打包成功了嗎膳灶?
緊接著又是另外一個(gè)錯(cuò)誤:
[圖片上傳失敗...(image-cde4d3-1527750575757)]
WTF,明明打包方式是ad-hoc立由,但是匹配的pp文件確是AppStore的轧钓?????
這必然是個(gè)坑
在此打開(kāi)了[官方文檔]看到了這么一句話(huà)
翻譯一下,如果你們沒(méi)用match這個(gè)action锐膜,來(lái)管理pp文件毕箍,我們推薦你在fastfile里面,自己定義一個(gè)map道盏,指定bundleID 和 pp文件而柑,以保證能夠正常構(gòu)建app文捶。但是我在文章開(kāi)頭就po圖了,我項(xiàng)目工程里的pp文件都是用match來(lái)管理的媒咳。所以剛開(kāi)始粹排,這段話(huà)被我忽略了。后續(xù)又是一陣在github issue上漫游涩澡。https://github.com/fastlane/fastlane/issues/10315 找到一個(gè)類(lèi)似的問(wèn)題顽耳。
既然bundleID,或者pp文件不對(duì)妙同,那我能不能?chē)L試著主動(dòng)寫(xiě)死正確的bundleID和pp文件名射富,放進(jìn)fastfile?
于是把gym加了個(gè)參數(shù)粥帚,不同環(huán)境下指定好:
gym(
scheme: scheme,
export_method: "ad-hoc",
silent:true,
output_directory:outputDirectory,
output_name:ipaName,
archive_path:outputDirectory,
export_xcargs: "-allowProvisioningUpdates",
export_options: {
provisioningProfiles: {
app_identifier => "match AdHoc #{app_identifier}"
}
}
)
保存胰耗,重新run打包腳本,終于可以成功打包了????芒涡。
簡(jiǎn)單說(shuō)說(shuō)Xcode8和9打包
筆者由于fastlane問(wèn)題沒(méi)解決柴灯,所以這期間打包工作都是手動(dòng)完成的,Product - Archive
然后等待Xcode自動(dòng)打费尽,這些操作相信大家都會(huì)的弛槐,不多說(shuō)了。選擇測(cè)試包之后依啰,彈出框框問(wèn)你是否瘦身乎串,一般別管就是。然后重點(diǎn)來(lái)了速警,相比Xcode8多了這么個(gè)頁(yè)面:
選擇pp文件叹誉,從網(wǎng)絡(luò)獲取,Xcode必須要登錄開(kāi)發(fā)者賬號(hào)闷旧,從賬號(hào)里面拉取相關(guān)pp文件长豁,還要自己選擇是哪個(gè)。
平時(shí)的測(cè)試包選擇“ad-hoc”就是忙灼,然后接著生產(chǎn)ipa匠襟。在Xcode8里,最終生成的一個(gè)ipa文件夾该园,里面就一個(gè)ipa酸舍,但是xcode9除了ipa之外,還有一些其他的東西里初,如下圖啃勉。
除了ipa之外,有個(gè)東西引起了我的注意ExportOptions.plist
預(yù)覽了一下這個(gè)plist双妨,里面就記錄了剛剛上幾步的一些選擇項(xiàng)淮阐。比如瘦身選項(xiàng)叮阅,還有個(gè)很關(guān)鍵的東西provisioningProfile
這個(gè)字段是個(gè)dictionary。
難道沒(méi)有一種似曾相識(shí)的趕腳泣特?
再次看看這張圖:
紅框框的部分的最后浩姥,說(shuō)的plist就是它。這個(gè)就是Xcode在導(dǎo)出ipa的時(shí)候一些參數(shù)状您。另外及刻,手動(dòng)Xcode打包和在終端里面敲 xcodebuild -archivePath,xcodebuild -exportArchive -exportOptionsPlist 本質(zhì)是一樣的竞阐,都是打包,參數(shù)就是同一個(gè)暑劝。
再回過(guò)頭來(lái)骆莹,看看我們最終的解決方案,我們?cè)趃ym中添加了一個(gè)字段担猛,就是在寫(xiě)參數(shù)而已
export_options: {
provisioningProfiles: {
app_identifier => "match AdHoc #{app_identifier}"
}
}
可能原因
到這一步幕垦,在回頭看看以上出現(xiàn)的bundleID和PP文件不匹配錯(cuò)誤,在用match管理pp文件的前提下傅联,有可能是因?yàn)閄code9引起的問(wèn)題先改,打包流程或者參數(shù)讀寫(xiě)哪里有點(diǎn)變化,需要fastlane團(tuán)隊(duì)做進(jìn)一步適配更新蒸走。上文中issue的鏈接狀態(tài)到截止筆者寫(xiě)作完成之時(shí)仇奶,任是在open狀態(tài)。所以這個(gè)原因有待關(guān)注比驻,當(dāng)然也希望能有大佬在指出原因该溯,感激不盡~
至此為止,踩過(guò)的坑全部都填平了别惦。不光是fastlane狈茉,用其他的一些工具或者第三方的時(shí)候還是要多多關(guān)注github上的issue,這里是塊大大寶藏掸掸,等待被你挖掘氯庆!
更多技術(shù)面試題與非技術(shù)面試題可以加我QQ:2673218363 QQ群:725611317
作為一個(gè)開(kāi)發(fā)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要這是一個(gè)我的iOS交流群:725611317扰付,不管你是小白還是大牛歡迎入駐 堤撵,分享BAT,阿里面試題、面試經(jīng)驗(yàn)羽莺,討論技術(shù)粒督, 大家需要資料的加小編群哦!