iOS开发fastlane从入门到入土(三):证书管理

match

前言

match是一种全新的证书和配置文件管理工具,它会把所有需要用到的证书传到git私有库上,任何需要配置的机器直接用match同步证书。团队所有成员共享一份代码签名,以减免不必要的证书创建。

本文主要介绍match的使用方法,另外顺带讲一下另外两种证书配置方法certsigh。如果你还对Fastlane不了解,请先阅读我上一篇文章《iOS开发fastlane从入门到入土(一):自动打包》


一、CredentialsManager

证书配置之前,必须先讲一下CredentialsManager凭据管理工具。
这个工具主要是提供登录iTunes connect 的凭证,一般在fastlane初始化的时候,如果选择打包到appstore,会提示你添加登录凭证。

命令行方式

  • 添加Credential
fastlane fastlane-credentials add --username felix@krausefx.com
Password: *********
Credential felix@krausefx.com:********* added to keychain.
  • 移除Credential
fastlane fastlane-credentials remove --username felix@krausefx.com
password has been deleted.

使用环境变量

以上方式会将felix@krausefx.com自动存入“钥匙链”,如果你不想存入“钥匙链”可以通过设置环境变量”FASTLANE_DONT_STORE_PASSWORD”为”1”
.env文件中加入:

  #iTunes connect登录用户名
  FASTLANE_USER = "felix@krausefx.com"
  #iTunes connect登录密码
  FASTLANE_PASSWORD = "xxxxxxx"
  #不存入“钥匙链”
  FASTLANE_DONT_STORE_PASSWORD = "1"

更多详情见github

二、Spaceship

spaceship暴露了 Apple Developer Center 和 iTunes Connect API。这些快速和强大的API已经是 fastlane 的一部分,能够实现更多 fastlane 的高级功能。脚本化 Developer Center 的工作流从未如此简单。
spaceship已经是fastlane的一部分了,很多 fastlane tools 已经使用了 spaceship,比如 sighcertproducepilotboarding

使用

在命令行中尝试运行 fastlane spaceship ,然后就会自动启动 spaceship playground。这要求你使用 sudo gem install pry 安装 prypry 不会默认安装,因为大部分的fastlane用户不需要 spaceship playground 。你可以在 Gemfile 文件里添加 pry 依赖。

两步验证[1]

如果你的苹果账户开启了两步验证,将会自动询问你使用手机进行验证。结果会话将会存储在 ~/.spaceship/[email]/cookie中。这个会话在一个月内是有效的,当然没有办法真的等到一个月后来测试。
使用以下命令生成一个web session:

fastlane spaceauth -u user@example.org

这个将会给你授权,并提供一个会话字符串:

export FASTLANE_SESSION='---\n- !ruby/object:HTTP::Cookie\n  name: DES5c148586dfd451e55afbaaa5f62418f91\n  value: HSARMTKNSRVTWFla1+yO4gVPowH17VaaaxPFnUdMUegQZxqy1Ie1c2v6bM1vSOzIbuOmrl/FNenlScsd/NbF7/Lw4cpnL15jsyg0TOJwP32tC/NguPiyOaaaU+jrj4tf4uKdIywVaaaFSRVT\n  domain: idmsa.apple.com\n  for_domain: true\n  path: "/"\n  secure: true\n  httponly: true\n  expires: 2016-04-27 23:55:56.000000000 Z\n  max_age: \n  created_at: 2016-03-28 16:55:57.032086000 -07:00\n  accessed_at: 2016-03-28 19:11:17.828141000 -07:00\n'

从 ---\n 开始复制所有的东西,然后当做环境变量提供,配置环境变量vim ~/.bash_profile,变量名是 FASTLANE_SESSION,你也可以放在.env里,不过需要去掉export,效果一样。

FASTLANE_SESSION='---\n- !ruby/object:HTTP::Cookie\n  name: myacinfo\n  value: xxx\n'

发包

如果你想通过fastlane上传构建到TestFlight/App Store Connect,你必须生成并使用一个特殊密码:

  1. 访问 appleid.apple.com/account/manage
  2. 生成一个新的特殊密码
  3. 使用环境变量名FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD提供这个特殊密码.

更多详情见github

三、Cert、Sigh使用

Cert

当新证书需要创建时,cert会执行以下步骤:

  • 创建一个新的私钥
  • 创建一个新的签名请求
  • 生成,下载并安装证书
  • 导入所有生成文件到钥匙串中

cert不会撤销您现有的证书。如果您不能创建更多证书,cert将引发异常,这意味着您必须撤销现有的证书之一,以便为新证书腾出空间。
cert无法从Apple Developer Portal下载现有证书+私钥,因为私钥永远不会离开您的计算机。
示例如下:

  lane :create_cert do
    cert(
      username: ENV['APPLE_ID'], # Apple ID
      team_id: ENV['TEAM_ID'], # Team ID
      development: true, # 创建一个开发证书
      force: "false", # 即使存在现有证书,也要创建证书,默认为false
      filename: "dev_cert", # 存储文件名
      output_path: "./certs/development", # 存储所有证书和私钥的目录的路径
    )
  end

更多cert的详细用法,请参考cert doc

Sigh

Sigh可以创建、更新、下载和修复配置文件(使用一个命令)。它支持App Store、Ad Hoc、Development 和 Enterprise,并支持一些不错的功能,比如自动添加所有测试设备。
你可以通过下面这行命令列出本地安装的所有provisioning profiles:

fastlane sigh manage

也可以删除所有失效的provisioning profiles:

fastlane sigh manage -e

provisioning profiles所在目录:~/Library/MobileDevice/Provisioning Profiles
你可以使用ProvisionQL在Finder中快速预览profiles文件,使用brew cask install provisionql快速安装。

使用示例如下:

lane :create_adhoc_profile do
        #如果没有在Apple Developer创建证书的话,get_certificates会帮你自动创建证书
        sigh(
            username: ENV['APPLE_ID'], # APPle ID
            team_id: ENV['TEAM_ID'], # team ID
            app_identifier: ENV['APP_IDENTIFIER'], # bundle id
            # cert_id: xxx, # 使用的证书id
            provisioning_name: 'com.xx.FastLane_AdHoc', # 开发者中心上面的描述文件名称
            ignore_profiles_with_different_name: true, # 与provisioning_name参数联合使用,true:当描述文件名称完全匹配provisioning_name时才下载,false:不完全匹配也下载
            force: true, # 更新描述文件并忽略其状态,同时自动为ad hoc profiles添加所有设备
            filename: "xxx.mobileprovision", # 存储文件名
            output_path: "./profiles/adhoc", # 存储的路径
            skip_install: false, # 默认会自动添加证书到你的本地机器上,设置该参数可以跳过该步骤
            # development: false,  # 更新开发证书而不是生产证书
            # readonly: true, # 只获取,不生成新的
            adhoc: true # true:生成AdHoc profiles,false:生成App Store Profiles
        )
  end

更多sigh的详细用法,请参考sigh doc

四、Match

建议使用这种方式管理证书,在使用match管理证书前,要先注册一个私有仓库,名字官方建议为certificates,本文管理仓库放在码云上。

初始化

进入项目目录执行

fastlane match init

系统会提示输入git仓库的链接,需确保当前账户有git仓库的访问权限。执行完成后会在fastlane目录下生成一个Matchfile文件,里面保存着你刚才输入的git仓库链接,以后操作match,会默认读取该URL。

git_url("https://gitee.com/xxx/certificates.git")

storage_mode("git")

type("development") # The default type, can be: appstore, adhoc, enterprise or development

# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
# username("user@fastlane.tools") # Your Apple Developer Portal username

# For all available options run `fastlane match --help`
# Remove the # in the beginning of the line to enable the other options

# The docs are available on https://docs.fastlane.tools/actions/match

删除旧证书和pp文件

官方建议通过命令清除之前的证书和描述文件,毕竟我们想从一个干净的环境出发。
企业账号慎用,销毁描述文件可能会导致App无法打开。

fastlane match nuke development  ---开发证书
fastlane match nuke distribution ---apple store 和 adhoc使用此命令  ​
fastlane match nuke enterprise  ---企业证书

生成证书和pp文件

lane :manageCert do
    match(
      git_url: "path",  # 指定包含所有证书的git私有仓库地址
      #git_branch: "branch", # 指定所使用的git分支
      type: "appstore",  # 指定创建证书的类型,可用选项:appstore, adhoc, development, enterprise
      username: ENV['APPLE_ID'], # APPle ID
      team_id: ENV['TEAM_ID'], # team ID
      app_identifier: ["tools.fastlane.app", "tools.fastlane.sleepy"],  # 程序的bundle identifier(s),多个时用逗号分隔
      readonly: true,  # true:仅获取已经存在的证书和描述文件,而不生成新的
      force: true,  # 每次执行match时,是否更新描述文件
      force_for_new_devices: true,  # 当Apple Developer Portal上的设备数量发生变化时,是否更新描述文件
      output_path: "./certs/development", # 导出的证书密钥以及profile文件路径
      verbose: true # 打印详细信息
    )
end

首次执行时,会要求输入一个密码,用来对证书进行加密,后续其他机器获取证书时使用该密码进行解密,输入密码后继续按照终端提示进行下一步操作,match会创建新的证书和描述文件,之后执行会拉取仓库已经存在的。
完成后,git仓库就会生成对应的certs及profiles文件夹来存放证书和配置文件。

注册新设备

  • 注册单台设备
fastlane run register_device
  • 注册多台设备
  desc "注册设备"
  lane :add_devices do
      register_devices(
        #devices_file: "./devices.txt",  # 指定包含设备信息的文件路径,文件具体格式参考https://devimages.apple.com.edgekey.net/downloads/devices/Multiple-Upload-Samples.zip
        devices: {
          "Luka iPhone 6" => "1234567890123456789012345678901234567890",
          "Felix iPad Air 2" => "abcdefghijklmnopqrstvuwxyzabcdefghijklmn"
        },  # 指定要注册的设备列表,格式为:设备名称 => UDID
        username: "xx@apple.com"  # 设置Apple ID
      ) 
  end

团队管理

关掉Automatically manage signing,使用手动管理证书。
新成员接入时,执行以下命令获取对应的证书文件:

fastlane match development --readonly
fastlane match adhoc --readonly
fastlane match appstore --readonly

更多match的详细用法,请参考match doc

五、PEM

如果需要有效的推送配置文件,pem将创建新的.pem、.cer和.p12文件。pem不包括将文件上载到服务器。

lane :notification_cert do
      pem(
        development: true,  # true:更新开发推送证书,false:更新生产推送证书
        generate_p12: true,  # 生成p12和pem文件
        force: true, # true:即使旧推送描述文件依然可用,仍然创建新的推送描述文件
        app_identifier: 'com.apple.xxx', # Bundle ID,
        save_private_key: true, #保存RSA私钥
        p12_password: '123456',  # 所生成p12文件的密码
        pem_name: 'notifier', #pem文件名
        username: ENV['APPLE_ID'],
        team_id: ENV['TEAM_ID'],
        output_path: "./certs/development",
        new_profile: proc do |profile_path|  # 如果生成了新的推送描述文件,该block会被调用
          puts profile_path  # 新的PEM文件的绝对路径
          # 添加上传PEM文件到服务器的代码
        end
      )
  end

  1. 两步验证的处理办法

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