前言
之前總結寫了關於fastlane match
命令,當時只是說了一下match是什麼,match的一些常用命令等。本次是寫進一步瞭解match命令之後的總結。
上一次瞭解了match後,發現match有比較多的侷限,主要問題在於證書和配置檔案必須重新生成,不能使用原有的證書和配置檔案,由於公司的證書和配置檔案已經生成好了,並且不能隨便銷燬和刪除,所以希望沿用現有的證書。通過查閱資料,還是找到了手動上傳配置檔案和證書的方法。
自動生成證書和配置檔案
先來回顧下自動生成的方案:
-
準備一個全新的遠端倉庫,用來儲存生成的證書和配置檔案
-
在開發者網站上建立需要生成證書和配置檔案的App ID(這一步不太確定是否必須做,使用高許可權的開發者賬號match可能會自動建立App ID)
-
在主專案的工程目錄下,初始化生成Matchfile檔案,當然首先需要安裝好fastlane
fastlane match init 複製程式碼
-
在Matchfile中寫入如下配置
git_url("https://gitee.com/xxxx/xxxxxxx.git") //新建一個專案,將地址複製到這裡 type("development") # 預設match所同步的型別,可不管 app_identifier("bundle Id") #bundleId,若同工程下有多個,則用["bundleId1","bundleId2"] username("user@fastlane.tools") #蘋果開發者賬號 複製程式碼
-
配置好後,在主專案工程目錄下執行:
fastlane match development --verbose 複製程式碼
執行這個命令過程中會讓輸入一個
passphrase
的密碼,記住這個密碼,在別的機器上同步證書和配置檔案時會用到。執行過程中還會遇到很多問題,多百度基本可以搞定。 -
成功生成證書和配置檔案之後,使用命令在別的裝置上安裝證書:
fastlane match development -- readonly --verbose 複製程式碼
-
如果需要更新證書,使用下面的命令會刪除開發者賬號下面的所有development證書,同時刪除倉庫中的證書,然後就可以從step 2開始重新生成證書和配置檔案了。
fastlane match nuke development --verbose 複製程式碼
手動上傳證書和配置檔案
查閱了參考文件[1][2]後,發現match命令是結合了cert命令和sigh命令生成證書和配置檔案的,生成過程中會判斷倉庫中是否有合適的證書和配置檔案,我們就可以通過這個機制來手動構造類似match倉庫的檔案結構,並且手動生成好合適的證書和配合檔案,放到相應的目錄中,再推到倉庫中。
-
構造證書倉庫的目錄結構
match的證書倉庫目錄結構為:
![證書目錄結構](/Users/gzx/Desktop/螢幕快照 2018-11-28 下午4.10.24.png)
![配置檔案目錄結構](/Users/gzx/Desktop/螢幕快照 2018-11-28 下午4.10.38.png) -
找到現有證書的cert id
使用ruby指令碼讀取開發者賬號中的所有證書,找到對應證書的Cert id,ruby指令碼為:
require `spaceship` Spaceship.login(`xxxxxx@xxx.com`) #輸入對應的蘋果賬號 Spaceship.select_team Spaceship.certificate.all.each do |cert| cert_type = Spaceship::Portal::Certificate::CERTIFICATE_TYPE_IDS[cert.type_display_id].to_s.split("::")[-1] puts "Cert id: #{cert.id}, name: #{cert.name}, expires: #{cert.expires.strftime("%Y-%m-%d")}, type: #{cert_type}" end 複製程式碼
其中列印出來的
cert
物件是證書物件,一個inHouse型別的證書物件其結構為:<Spaceship::Portal::Certificate::InHouse id="GF0ZY66W6D", name="iOS Distribution", status="Issued", created=2017-12-19 02:52:11 UTC, expires=2020-12-18 02:42:11 UTC, owner_type="team", owner_name="Communications Corporation Limited", owner_id="12GF5VQGBX", type_display_id="9RQEK7MSXA", can_download=true> 複製程式碼
這裡尋找哪個證書還是挺麻煩的,開發者賬號中的證書太多了,我也沒有仔細想方法,就是按照日期和owner_id來尋找的。
-
加密證書和配置檔案
從Apple Developer中下載現有的證書及mobileprovision檔案,將證書匯入到鑰匙中,並生成p12檔案。得到的證書和配置檔案還不能被match識別,需要通過加密命令加密後才符合match的驗證要求,其中使用到的命令有:
-
加密證書
- 執行
openssl pkcs12 -nocerts -nodes -out key.pem -in {證書}.p12
生成.pem檔案 - 執行
openssl aes-256-cbc -k {密碼} -in key.pem -out {cert_id}.p12 -a
生成加密後的p12 - 執行
openssl aes-256-cbc -k {密碼} -in {證書}.cer -out {cert_id}.cer -a
生成加密的證書,其中cert_id為前面執行ruby指令碼所找到的證書id
- 執行
-
加密配置檔案
- 配置檔案起名需要符合規則
{Development/ADHoc/AppStore/InHouse}_bundleId.mobileprovision
- 加密命令
openssl aes-256-cbc -k {密碼} -in xxxx.mobileprovision -out Development_yyyy.mobileprovision -a
- 配置檔案起名需要符合規則
注意加密證書和配置檔案的密碼必須一致,在其他裝置同步證書和配置檔案的時候需要輸入這個密碼
-
-
將加密好的證書和配置檔案放到對應目錄中,並提交上傳倉庫
以上加密過的cer檔案和p12檔案放到對應的certs目錄下對應的資料夾中,加密的mobileprovision檔案放到profiles目錄下對應的資料夾中,提交commit到遠端證書倉庫
-
使用命令驗證證書有效性
在對應工程目錄執行:
fastlane match development --verbose 複製程式碼
如果成功,說明建立的證書沒問題。
-
在其他裝置使用證書
在其他裝置上使用命令同步證書和配置檔案:
fastlane match development --readonly --verbose 複製程式碼
需要輸入上面加密的密碼,之後同步成功。
其他的侷限性
解決了match手動同步證書問題,但也意識到match的其他侷限性:
-
使用match手動同步證書有什麼意義?
手動同步操作比較麻煩,這樣做的好處其實和自己管理證書倉庫的區別不大,管理證書人員的工作量基本上沒有減少,主要好處在於其他人使用的時候更加方便,不用克隆倉庫也不用手動安裝證書和配置檔案,使用一個命令就可以實現自動安裝證書的目的。
個人認為match的初衷還是推薦使用match自動建立證書的,但確實不太明白nuke命令的設計初衷,並且證書更新也是很大的問題,後面會講到更新證書的問題。可能match更加適合證書變動不太頻繁的情況使用。
-
nuke命令很危險
一聽這個單詞就很可怕,用核武器攻擊,我本來打算嘗試使用nuke命令登出證書和配置檔案的,但看到命令提示還是慫了,==執行nuke命令是會登出賬號下面所有的證書和配置檔案==,不是隻登出對應bundleId的證書和配置檔案,要是自己的開發者賬號還能玩玩,對於公司開發者賬號來說還是算了(沒有嘗試執行這個命令)。
![nuke命令的提示](/Users/gzx/Desktop/螢幕快照 2018-11-28 下午2.42.46.png) -
更新證書和配置檔案比較麻煩
我理解nuke命令其實主要是用來更新證書用的,說是更新其實是重置,命令比較危險。在現有的證書情況和開發人員管理情況下,distribution的證書和配置檔案比較穩定,因為大家共用一個證書,配置檔案基本也沒什麼修改的餘地,除了有過期風險;而development的證書和配置檔案改動就比較多了,一旦新增或登出裝置都需要更新證書和配置檔案,如果還是用match命令自動生成,就得先nuke,然後重新建立,或者手動重新上傳證書和配置檔案。
能想到的比較好的方案就是,不使用邀請開發者的模式,development和distribution的證書和配置檔案都由一個賬號統一生成並且分配使用,新增裝置也由賬號管理者統一新增,更改之後可以根據變動大小決定使用nuke還是手動更新證書和配置檔案,這個方案主要針對development情況,當然distribution的證書和配置檔案也可以使用這個方案更新。
總結
個人認為match也不是特別完美的管理證書的解決方案,還需要根據實際情況分析是否適合使用,如何使用。另外,文章中有什麼不對的地方還請讀者指出,大家共同進步,謝謝!