當Fastlane遇到Xcode9打包出來不一定是ipa而是坑

搶手的哥發表於2017-12-14

Fastlane簡介

Fastlane 是用Ruby語言編寫的一套自動化工具集和框架,每一個工具實際都對應一個Ruby指令碼,用來執行某一個特定的任務。Fastlane的強大之處,就是可以將不同的工具(action)有機而靈活的結合在一起,從而形成一個完整的自動化流程,大大提高了日常的開發測試效率,推薦大家使用。 如果你尚未使用這個工具,可以點選一下幾篇文章學習如何使用: 【CI】持續整合-引導篇 【CI】持續整合-第一篇 fastlane

背景&現象

公司專案日常開發中,已經使用了fastlane,配合gitlab一起實現自動打包以及分發,使用期間感覺很順暢,沒有出過什麼問題。但是,自從Xcode升級到Xcode9正式版之後打包一直出問題,打不了包。

環境配置

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**
複製程式碼

工程專案中 provisioning profile(以下簡稱pp檔案),靈活運用了match這個action外加手動配置。

工程配置.png

錯誤描述:

error.png
看到了框框的那句話,剛開始以為是推送證書或者是provisioning profile的問題,然後手動在此執行了match,把證書什麼的裡裡外外更新了一遍,發現還是不起作用。沒辦法,只能翻看github 看看issue,看看有木有類似的處理方案。

原因

功夫不負有心人,喵神大佬道破真相: Xcode9將不會允許你訪問鑰匙串裡的內容,除非設定allowProvisioningUpdates。

社會我喵神.png
所以說,在執行xcode -exportArchive的時候,因為許可權訪問鑰匙串,所以無法讀取到專案工程裡的pp檔案,進而打包失敗,並且報錯說缺少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",
)
複製程式碼

儲存,再執行一次打包命令,請注意,這個時候xcode會彈窗讓你確認,點一直允許就是了。特別注意的是,如果和我們公司一樣的環境,那麼那臺遠端打包的伺服器,在更新完fastfile第一次跑的時候,要遠端連線上去手動點選確認框,不然打包指令碼就會一直卡在那裡。

image.png

到此為止,Xcode9讀取鑰匙串許可權的問題就結束了。

但是,你以為這樣就結束了嗎?就能打包成功了嗎?

緊接著又是另外一個錯誤:

不匹配.png
WTF,明明打包方式是ad-hoc,但是匹配的pp檔案確是AppStore的???

這必然是個坑

在此開啟了官方文件看到了這麼一句話

image.png
翻譯一下,如果你們沒用match這個action,來管理pp檔案,我們推薦你在fastfile裡面,自己定義一個map,指定bundleID 和 pp檔案,以保證能夠正常構建app。但是我在文章開頭就po圖了,我專案工程裡的pp檔案都是用match來管理的。所以剛開始,這段話被我忽略了。後續又是一陣在github issue上漫遊。https://github.com/fastlane/fastlane/issues/10315 找到一個類似的問題。

既然bundleID,或者pp檔案不對,那我能不能嘗試著主動寫死正確的bundleID和pp檔名,放進fastfile?

於是把gym加了個引數,不同環境下指定好:

        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打包指令碼,終於可以成功打包了??。

oh yeah.png

簡單說說Xcode8和9打包

筆者由於fastlane問題沒解決,所以這期間打包工作都是手動完成的,Product - Archive然後等待Xcode自動打,這些操作相信大家都會的,不多說了。選擇測試包之後,彈出框框問你是否瘦身,一般別管就是。然後重點來了,相比Xcode8多了這麼個頁面:

image.png
選擇pp檔案,從網路獲取,Xcode必須要登入開發者賬號,從賬號裡面拉取相關pp檔案,還要自己選擇是哪個。
image.png
平時的測試包選擇“ad-hoc”就是,然後接著生產ipa。在Xcode8裡,最終生成的一個ipa資料夾,裡面就一個ipa,但是xcode9除了ipa之外,還有一些其他的東西,如下圖。
image.png
除了ipa之外,有個東西引起了我的注意ExportOptions.plist 預覽了一下這個plist,裡面就記錄了剛剛上幾步的一些選擇項。比如瘦身選項,還有個很關鍵的東西provisioningProfile這個欄位是個dictionary。
image.png

難道沒有一種似曾相識的趕腳?

再次看看這張圖:

error.png
紅框框的部分的最後,說的plist就是它。這個就是Xcode在匯出ipa的時候一些引數。另外,手動Xcode打包和在終端裡面敲 xcodebuild -archivePath,xcodebuild -exportArchive -exportOptionsPlist 本質是一樣的,都是打包,引數就是同一個。 再回過頭來,看看我們最終的解決方案,我們在gym中新增了一個欄位,就是在寫引數而已

export_options: {
				provisioningProfiles: {
					app_identifier => "match AdHoc #{app_identifier}"
				}
			} 
複製程式碼

可能原因

到這一步,在回頭看看以上出現的bundleID和PP檔案不匹配錯誤,在用match管理pp檔案的前提下,有可能是因為Xcode9引起的問題,打包流程或者引數讀寫哪裡有點變化,需要fastlane團隊做進一步適配更新。上文中issue的連結狀態到截止筆者寫作完成之時,任是在open狀態。所以這個原因有待關注,當然也希望能有大佬在指出原因,感激不盡~

至此為止,踩過的坑全部都填平了。不光是fastlane,用其他的一些工具或者第三方的時候還是要多多關注github上的issue,這裡是塊大大寶藏,等待被你挖掘!

相關文章