前言
iOS開發(fā)在團(tuán)隊(duì)項(xiàng)目協(xié)作中,面臨著許許多的挑戰(zhàn),除了被大家詬病的nib文件和故事板以外,還有就是今天要說的證書管理問題,相信做過iOS開發(fā)的用戶對fastlane已經(jīng)不陌生了,它提供了很多有用的功能來幫助開發(fā)者從繁瑣的重復(fù)性勞動(dòng)中解脫出來,這里列舉出一些:

- deliver: 上傳截圖, 元數(shù)據(jù), app應(yīng)用程序到App Store
- supply: 上傳Android app應(yīng)用程序和元數(shù)據(jù)到Google Play
- snapshot: 自動(dòng)捕獲iOS app應(yīng)用程序本地截圖
- screengrab: 自動(dòng)捕獲Android app應(yīng)用程序本地截圖
- frameit: 快速截屏并將截屏放入設(shè)備中
- pem: 自動(dòng)生成和更新推送通知配置文件
- sigh: 開發(fā)證書和描述文件下載
- produce: 使用命令行在iTunes Connect上創(chuàng)建新的app和開發(fā)入口
- cert: 自動(dòng)創(chuàng)建和配置iOS代碼簽名證書
- spaceship: Ruby 庫訪問 Apple開發(fā)者中心和 iTunes Connect
- pilot: 最好的方式管理你的TestFlight 測試人員和從終端構(gòu)建
- boarding: 最簡單的方式邀請你的TestFlight beta測試人員
- gym: iOS app打包簽名自動(dòng)化工具
- match: 使用Git同步你的團(tuán)隊(duì)證書和配置文件
- scan: 最簡單方式測試你的 iOS 和 Mac apps
今天說的其實(shí)是match,我們知道,蘋果公司在個(gè)人開發(fā)者賬號上面對于證書的生成是有嚴(yán)格的數(shù)量限制的,development 和 distribution證書類型只能生成2個(gè),所以如果按照fastlane每次build不同的target或者不同的Bundle ID的話,它都會(huì)重新去生成一個(gè)新的證書并以此生成對應(yīng)的描述文件,這樣以來,我們也只能最多同時(shí)用該開發(fā)者賬號簽名兩個(gè)App安裝在真機(jī)上,想用第三個(gè)就必須revoke掉以前生成的證書,當(dāng)然了,一旦把證書revoke掉了,這也就意味著我們用該證書簽名的App也不能在真機(jī)上面使用了。所以就得考慮一下,該如果復(fù)用現(xiàn)有證書。
1. 拿到你想要復(fù)用證書的ID
關(guān)于這個(gè)證書ID,從鑰匙串和openssl工具庫中沒有找到方法來取到,但是可以通過spaceship這個(gè)庫來實(shí)現(xiàn),下面是相關(guān)腳本:
require 'spaceship'
Spaceship.login('your@apple.id')
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
執(zhí)行上面代碼,會(huì)輸出所有證書的相應(yīng)信息,你可以從中找到你想復(fù)用的那個(gè)證書的ID。
2. 創(chuàng)建遠(yuǎn)程倉庫來保存證書。
建立一個(gè)遠(yuǎn)程倉庫,并在該目錄下創(chuàng)建certs/distribution和 certs/development目錄,分別存放生產(chǎn)和開發(fā)環(huán)境下的相關(guān)證書文件。
3. 通過鑰匙串導(dǎo)出你想要復(fù)用的那個(gè)證書
導(dǎo)出對應(yīng)的cer文件和p12文件。
4. 執(zhí)行下面命令,導(dǎo)出私鑰文件
openssl pkcs12 -nocerts -nodes -out key.pem -in certificate.p12
5. 生成最后需要的證書
openssl aes-256-cbc -k <your_password> -in key.pem -out <cert_id>.p12 -a
openssl aes-256-cbc -k <your_password> -in certificate.cer -out <cert_id>.cer -a
這里的cert_id是上面我們保存的證書id,其中執(zhí)行完上述步驟后,就生成了fastlane match想要的證書,當(dāng)執(zhí)行fastlane match development/adhoc/appstore命令后,match就不會(huì)在Apple Development Center重新生成證書了,而是用現(xiàn)有的。
將證書分別放到對應(yīng)的git倉庫目錄中,提交并推送到遠(yuǎn)程倉庫。
6. 在開發(fā)者網(wǎng)站上面生成App ID
fastlane produce -u <your@apple.id> -a <your_app_bundle_id> --skip_itc
如果你的App需要在ITC(iTunes Connect)中創(chuàng)建,則移除--skip_itc選項(xiàng)。
7. 生成證書對應(yīng)的描述文件
fastlane match <type>
其中type有四種:development/adhoc/distribution/appstore
如果執(zhí)行過程中,出現(xiàn)輸入Git Repo密碼后,密碼錯(cuò)誤導(dǎo)致的不能解密repo,可以嘗試著用fastlane match change_password來重置密碼。如果修改密碼后,發(fā)現(xiàn)還是不行的話,可以在與distribution同級目錄下創(chuàng)建一個(gè)txt文件:"match_version.txt",內(nèi)容為fastlane版本號即可,再重新執(zhí)行。
[22:57:23]: Cloning remote git repo...
[22:57:28]: Migrating to new match...
[22:57:28]: Enter the passphrase that should be used to encrypt/decrypt your certificates
[22:57:28]: This passphrase is specific per repository and will be stored in your local keychain
[22:57:28]: Make sure to remember the password, as you'll need it when you run match on a different machine
Passphrase for Git Repo: ******
Type passphrase again: ******
[22:57:34]: ?? Successfully encrypted certificates repo
[22:57:34]: Cloning remote git repo...
[22:57:39]: Couldn't decrypt the repo, please make sure you enter the right password!
version: 256
class: "inet"
::::
::::
關(guān)于注冊新設(shè)備
在這之前我們都是通過開發(fā)者中心來添加和管理更新設(shè)備以及描述文件,有了fastlane提供的match命令則可以幫助我們做這些事情。
注冊新設(shè)備
我們可以通過添加action的方式更新Fastfile文件:
- 直接添加設(shè)備
register_devices(
devices: {
"Luka iPhone 6" => "1234567890123456789012345678901234567890",
"Felix iPad Air 2" => "abcdefghijklmnopqrstvuwxyzabcdefghijklmn"
}
) # Simply provide a list of devices as a Hash
- 通過文件添加設(shè)備
register_devices(
devices_file: "./devices.txt"
) # Alternatively provide a standard UDID export .txt file, see the Apple Sample (http://devimages.apple.com/downloads/devices/Multiple-Upload-Samples.zip)
文件格式參考demo:http://devimages.apple.com/downloads/devices/Multiple-Upload-Samples.zip
你也可以添加參數(shù):
register_devices(
devices_file: "./devices.txt", # You must pass in either `devices_file` or `devices`.
team_id: "XXXXXXXXXX", # Optional, if you"re a member of multiple teams, then you need to pass the team ID here.
username: "luka@goonbee.com" # Optional, lets you override the Apple Member Center username.
)
更新描述文件
match(type: "adhoc", force_for_new_devices: true)
注意這里的type,對應(yīng)我們前面提到的幾種類型
除此之外,我們也可以通過命令行的方式來更新描述文件:
fastlane match adhoc --force_for_new_devices
這樣以來,fastlane會(huì)重新更新描述文件并提交到我們的證書倉庫。
后面我們需要做的就是,只需重新打包,然后將包通過Airport安裝到新的設(shè)備上就可以了,經(jīng)測試以前用該描述文件打的包也可以安裝到新設(shè)備上面去。
關(guān)于Apple ID開啟雙重驗(yàn)證
如果開啟雙重驗(yàn)證,默認(rèn)蘋果會(huì)在新設(shè)備登錄時(shí),需要手動(dòng)輸入驗(yàn)證碼,這時(shí)候如果是在CI上面構(gòu)建,就會(huì)帶來問題,此時(shí)我們可以通過以下方式解決:
- 訪問Apple ID網(wǎng)站,找到 安全 - App 專用密碼,生成一個(gè)專用密碼
- 然后在構(gòu)建服務(wù)器上面配置環(huán)境變量: vim ~/.bash_profile
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=<YOUR_PASSWORD>
- 執(zhí)行 fastlane spaceauth -u <YOUR_APPLE_ID> 按提示獲取session信息
- 復(fù)制session信息(很長一大段) 配置環(huán)境變量: vim ~/.bash_profile
export FASTLANE_SESSION=‘YOUR SESSION’