fastlane match を使用した証明書の作成と更新

## [fastlane match](https://docs.fastlane.tools/actions/match/) とは

fastlaneアクションの1つで、iOS用の証明書を管理・共有するための仕組みです。

[Easily sync your certificates and profiles across your team](https://docs.fastlane.tools/actions/match/#easily-sync-your-certificates-and-profiles-across-your-team)
> A new approach to iOS code signing: Share one code signing identity across your development team to simplify your codesigning setup and prevent code signing issues.

## なぜ証明書を共有する仕組みが必要なのか

Xcodeで実機向けビルドを行うには、証明書(Certificate)とProvisioning Profileが登録されている必要があります。
各開発者の環境やCIでのビルドを行う場合に、それぞれの環境で証明書とProvisioning Profileが必要になり、
環境が増えたり証明書の更新が発生した場合に、手動で配布し直すのはとても手間がかかる作業です。

## 証明書を新しく作成する

### 1. matchの初期化

```sh
fastlane match init
```

### 2. 証明書を作成する

新しくアプリを作る（Apple Dev CenterにApp IDが登録されていない）場合、下記を実行してアプリを登録します。既にApp IDが登録されている場合はスキップしてください。

```sh
fastlane produce -u ${apple_id} -a ${app_identifier} --skip_itc
```

以下コマンドで、証明書を作成します。リポジトリでGitを指定した場合に、途中`Passphrase for Git Repo:` と尋ねられる箇所は、証明書の暗号化／復号化の際に使用するパスフレーズを指定します。

```sh
fastlane match development
```

## 証明書を更新する

更新に関しては、`fastlane match init`で作成・管理された証明書が前提となります。

また、fastlane matchでは[証明書を一つしか扱うことができず](https://github.com/fastlane/fastlane/issues/10724)、証明書の更新を行うには、現在の証明書を削除してから新しい証明書を作成する必要があります。

### 1. 既存の証明書を削除する

`fastlane match nuke`コマンドを使用します。削除対象として`development` or `distribution`を指定します。

`nuke`コマンドを実行すると、対象となる証明書及びProfileと、実行確認が表示されます。

```sh:example
fastlane match nuke development
...

+-----------------+------------+-------------+------------+
|        Certificates that are going to be revoked        |
+-----------------+------------+-------------+------------+
| Name            | ID         | Type        | Expires    |
+-----------------+------------+-------------+------------+
| iOS Development | XXXXXXXXXX | Development | 2020-07-10 |
+-----------------+------------+-------------+------------+

+--------------+------------+--------+-------------+------------+
|      Provisioning Profiles that are going to be revoked       |
+--------------+------------+--------+-------------+------------+
| Name         | ID         | Status | Type        | Expires    |
+--------------+------------+--------+-------------+------------+
| match        | XXXXXXXXXX | Active | iOS         | 2020-07-10 |
| Development  |            |        | Development |            |
| xxx.xxx.Xxx  |            |        |             |            |
+--------------+------------+--------+-------------+------------+
...
```

### 2. 新しい証明書を作成する

`fastlane match`コマンドで証明書を作成します。

```sh:example
fastlane match development
```

#### NOTE: 証明書を削除するにあたって、以下の点に注意しておきましょう

- AppStoreを経由しているアプリは、現在の証明書が削除されても使用できる
- AppStoreを経由していないアプリ(enterprise)は、使用できなくなる
- その他、以下リンク先の記載項目について確認しておく
  - [証明書の期限切れや失効 - サポート](https://developer.apple.com/jp/support/certificates)

## 共有された証明書を取得する

共有された証明書を取得するには、下記のコマンドを使用します。
`readonly`オプションを付けることにより、新たに証明書・プロファイルが作成されなくなり、開発者ポータルへのアクセスを行うことなく証明書の取得が可能になります。

```sh
fastlane match development --readonly
```

`Fastfile`に以下のようなレーンを追加しておくことで、`fastlane`コマンドから証明書を取得することが可能です。

```sh:Fastfile
lane :cert do
  match(type: "development", readonly: true)
end
```

## 参考URL

- [match - fastlane docs](https://docs.fastlane.tools/actions/match)
- [iOSアプリのサブミット自動化と証明書管理の効率化](https://techlife.cookpad.com/entry/2018/05/17/113000)