关于fastlane已存在的证书复用问题

前言

iOS开发在团队项目协作中,面临着许许多的挑战,除了被大家诟病的nib文件和故事板以外,还有就是今天要说的证书管理问题,相信做过iOS开发的用户对fastlane已经不陌生了,它提供了很多有用的功能来帮助开发者从繁琐的重复性劳动中解脱出来,这里列举出一些:


fastlane.png
  • deliver: 上传截图, 元数据, app应用程序到App Store
  • supply: 上传Android app应用程序和元数据到Google Play
  • snapshot: 自动捕获iOS app应用程序本地截图
  • screengrab: 自动捕获Android app应用程序本地截图
  • frameit: 快速截屏并将截屏放入设备中
  • pem: 自动生成和更新推送通知配置文件
  • sigh: 开发证书和描述文件下载
  • produce: 使用命令行在iTunes Connect上创建新的app和开发入口
  • cert: 自动创建和配置iOS代码签名证书
  • spaceship: Ruby 库访问 Apple开发者中心和 iTunes Connect
  • pilot: 最好的方式管理你的TestFlight 测试人员和从终端构建
  • boarding: 最简单的方式邀请你的TestFlight beta测试人员
  • gym: iOS app打包签名自动化工具
  • match: 使用Git同步你的团队证书和配置文件
  • scan: 最简单方式测试你的 iOS 和 Mac apps

今天说的其实是match,我们知道,苹果公司在个人开发者账号上面对于证书的生成是有严格的数量限制的,developmentdistribution证书类型只能生成2个,所以如果按照fastlane每次build不同的target或者不同的Bundle ID的话,它都会重新去生成一个新的证书并以此生成对应的描述文件,这样以来,我们也只能最多同时用该开发者账号签名两个App安装在真机上,想用第三个就必须revoke掉以前生成的证书,当然了,一旦把证书revoke掉了,这也就意味着我们用该证书签名的App也不能在真机上面使用了。所以就得考虑一下,该如果复用现有证书。

1. 拿到你想要复用证书的ID

关于这个证书ID,从钥匙串和openssl工具库中没有找到方法来取到,但是可以通过spaceship这个库来实现,下面是相关脚本:

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

执行上面代码,会输出所有证书的相应信息,你可以从中找到你想复用的那个证书的ID。

2. 创建远程仓库来保存证书。

建立一个远程仓库,并在该目录下创建certs/distributioncerts/development目录,分别存放生产和开发环境下的相关证书文件。

3. 通过钥匙串导出你想要复用的那个证书

导出对应的cer文件和p12文件。

4. 执行下面命令,导出私钥文件

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,其中执行完上述步骤后,就生成了fastlane match想要的证书,当执行fastlane match development/adhoc/appstore命令后,match就不会在Apple Development Center重新生成证书了,而是用现有的。
将证书分别放到对应的git仓库目录中,提交并推送到远程仓库。

6. 在开发者网站上面生成App ID

fastlane produce -u <your@apple.id> -a <your_app_bundle_id> --skip_itc

如果你的App需要在ITC(iTunes Connect)中创建,则移除--skip_itc选项。

7. 生成证书对应的描述文件

fastlane match <type> 

其中type有四种:development/adhoc/distribution/appstore
如果执行过程中,出现输入Git Repo密码后,密码错误导致的不能解密repo,可以尝试着用fastlane match change_password来重置密码。如果修改密码后,发现还是不行的话,可以在与distribution同级目录下创建一个txt文件:"match_version.txt",内容为fastlane版本号即可,再重新执行。

[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"
::::
::::

关于注册新设备

在这之前我们都是通过开发者中心来添加和管理更新设备以及描述文件,有了fastlane提供的match命令则可以帮助我们做这些事情。
注册新设备
我们可以通过添加action的方式更新Fastfile文件:

  1. 直接添加设备
register_devices(
  devices: {
    "Luka iPhone 6" => "1234567890123456789012345678901234567890",
    "Felix iPad Air 2" => "abcdefghijklmnopqrstvuwxyzabcdefghijklmn"
  }
) # Simply provide a list of devices as a Hash
  1. 通过文件添加设备
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

你也可以添加参数:

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,对应我们前面提到的几种类型
除此之外,我们也可以通过命令行的方式来更新描述文件:

fastlane match adhoc --force_for_new_devices

这样以来,fastlane会重新更新描述文件并提交到我们的证书仓库。
后面我们需要做的就是,只需重新打包,然后将包通过Airport安装到新的设备上就可以了,经测试以前用该描述文件打的包也可以安装到新设备上面去。

关于Apple ID开启双重验证

如果开启双重验证,默认苹果会在新设备登录时,需要手动输入验证码,这时候如果是在CI上面构建,就会带来问题,此时我们可以通过以下方式解决:

  1. 访问Apple ID网站,找到 安全 - App 专用密码,生成一个专用密码
  2. 然后在构建服务器上面配置环境变量: vim ~/.bash_profile
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=<YOUR_PASSWORD>
  1. 执行 fastlane spaceauth -u <YOUR_APPLE_ID> 按提示获取session信息
  2. 复制session信息(很长一大段) 配置环境变量: vim ~/.bash_profile
export FASTLANE_SESSION=‘YOUR SESSION’

参考

  1. Simplify your life with fastlane match
  2. register_devices - fastlane docs
  3. match - fastlane docs
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容

  • fastlane运行所需要的环境: OS X 10.9以上 Ruby 2.0 以上 Xcode 拥有一个开发者账号...
    阿姣_0405阅读 2,918评论 0 4
  • 引言关于开发证书配置(Certificates & Identifiers & Provisioning Prof...
    molake阅读 47,945评论 7 62
  • 最近使用fastlane,每当新建一个project/target的时候,当执行 match developmen...
    jacinzhang阅读 2,709评论 2 6
  • 月光是个大舞台 孩子们灵活的小手 变化出千奇百怪的影像 上映着奇妙的戏剧 月光是一帘轻纱 孩子们的剪刀手 裁出月光...
    深浅慧阅读 384评论 0 0
  • http://m.acfun.tv/v/?ac=3331270 如果全世界停止转动,只有你是自由的,你会选择这样的...
    濮水之中阅读 326评论 0 0