美文网首页fastlane自动化系列
iOS开发fastlane从入门到入土(三):证书管理

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

作者: 不会算卦的杨大仙 | 来源:发表于2019-03-22 09:34 被阅读0次
    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. 两步验证的处理办法

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ewixvqtx.html