【iOS/Xcode】Fastlane matchで証明書(Certificates)等の自動管理

この記事からわかること
- iOS/Xcodeの自動化ツール:Fastlaneの導入方法と使い方
- Fastlane matchの使い方
- 証明書(Certificates)やプロビジョニングプロファイルの自動管理
index
[open]
\ アプリをリリースしました /
環境
- Xcode:16.3
- iOS:18.4
- Swift:6
- macOS:Sequoia 15.4
- fastlane:2.228.0
Fastlane自体については以下の記事を参考にしてください。
Fastlane matchとは?
fastlane match
とはiOSアプリの署名に関わる証明書(Certificates)やプロビジョニングプロファイルの管理を自動化するためのツールです。個人開発の場合は自動署名機能(Automatically manage signing)などがあるのでそれほど使うことはないですがチームでの開発やCI/CDとの統合がある場合に複雑化しがちな証明書(Certificates)やプロビジョニングプロファイルの管理を一括で請け負ってくれます。
fastlane matchでできること
- 証明書(Certificates)の生成・管理
- プロビジョニングプロファイルの生成・管理
- リポジトリ(例:GitHub)に暗号化して保存
- キーチェーンに自動で証明書をインストール
- ローカル(※)に自動でプロビジョニングプロファイルをダウンロード
- 複数人・複数マシン間での署名情報の一元管理
- 開発・本番(App Store)・AdHoc など環境別に管理
※ 自動生成されたプロビジョニングプロファイルは~/Library/MobileDevice/Provisioning Profiles/
の中にダウンロードされます。これは「Automatically manage signing」を使用して生成した場合と同じ保管場所になります。
既存プロジェクトへのfastlane matchの導入
既存のプロジェクトへfastlane match
を導入してみたいと思います。
- 証明書管理用の空のリポジトリの作成
- fastlane自体の導入
- fastlane matchのセットアップ
- 各環境の証明書/プロビジョニングプロファイルの自動生成
1.証明書管理用の空のリポジトリの作成
まずは証明書を管理するための空のリポジトリを用意します。今回はGitHub上に用意したいので手動でprivateなリポジトリを作成しておいてください。リポジトリ名に指定はないですがcertificates
とつけておくとわかりやすいです。
2.fastlane自体の導入
まずはfastlane自体を導入する必要があるのでプロジェクトルートでfastlane init
コマンドを実行します。詳細な導入手順はこちらを参考にしてください。
3
を選択して自動でセットアップしてもらうと楽です。
3.fastlane matchのセットアップ
続いてfastlane match init
コマンドを実行します。すると管理先にストレージを問われるので1.git
を選択して次へ進みます。
privateなGitリポジトリを作ることをお願いされ、そのURLを問われるので先ほど作成しておいたリポジトリのURLを入力します。
完了すると./fastlane/Matchfile
が生成されます。URLを間違えてしまっていた場合はこのファイル内のURLを修正すればOKです。
4.各環境の証明書/プロビジョニングプロファイルの自動生成
証明書/プロビジョニングプロファイルを自動生成するにはfastlane match [環境]
コマンドを実行します。開発環境ならdevelopment
、本番環境ならappstore
になります。実行するとmatch
用のパスワードの入力を求められます。これはチーム間で共有するものになるので個人的なものは使わないようにしてください。
パスワードを入力して進めるとGitリポジトリに自動でディレクトリと暗号化された証明書やプロビジョニングプロファイルが生成されます。またローカル側ではキーチェーンに証明書をインストールし、~/Library/MobileDevice/Provisioning Profiles/[UUID].mobileprovision
のような形でプロビジョニングプロファイルもダウンロードされます。

他の開発者メンバーがmatchでプロビジョニングプロファイルを取得する
チーム内の他の開発者メンバーがリポジトリに生成しているプロビジョニングプロファイルを取得するためにはターミナルでfastlane match
コマンドを実行します。取得したいだけの場合は--readonly
オプションを付与することでApp Store Portalへのアクセスを省略(新規作成や更新をしないように)することができます。開発メンバーには意図せず更新されないように--readonly
オプションを使用することをルール化しておいた方が良いです。
この際に指定したパスフレーズの入力を求められます。パスワード自体はそのまま共有するかfastlaneで読み込む用の.env
ファイルにMATCH_PASSWORD
に記載しておき、このファイルを共有する方法でもOKです。
またターミナルからのコマンド実行でも可能ではありますが--readonly
オプションの付け忘れなどもあるので後述しているFastlaneのレーンに記載する方法のはおすすめです。
Xcodeからビルドする
あまりないとは思いますが、ローカルにプロビジョニングプロファイルが取得できていればXcode側と自動で紐づいているのでプロビジョニングプロファイルを選択する箇所にmatch 環境 com.XXX.XXXXX
と表示されるようになります。これを選択することでXcodeからも問題なくビルドができるようになっていると思います。
Fastlaneのレーンでmatchアクションを使用する
Fastlaneのレーンではmatch
アクションを使用することで未生成であれば自動生成・生成済みであれば取得処理を行うことができます。match
アクションの引数type
に取得したい環境名を指定します。
上記の場合だと証明書類のインストールの前に以下のように2ファクタ認証が必要になってしまいます。
App Store Connect API Keyを使用する
2ファクタ認証が必須になってしまうとチームでの開発に影響が出てしまうのでApp Store Connect API Keyを使用して認証する方式にすることで2ファクタ認証が不要になります。
作業として必要になるのは「App Store Connect APIキー(.p8ファイル)」の取得とAPIキーによる認証の実装です。作業としては以下の記事でまとめている部分と同じなので詳細は以下の記事を参考にしてください。
おすすめ記事:App Store Connect APIキーの取得
手順だけ紹介すると以下の通りです。
- App Store Connect APIキー(.p8ファイル)の生成とダウンロード
- fastlaneと同階層にキーを設置
- .envファイルを作成し、中に必要な情報を記載
- app_store_connect_api_keyアクションで認証(JWTの作成)
.envには以下のようにそれぞれの情報を記載します。
レーン内にapp_store_connect_api_key
アクションでキーによる認証を実装し引数api_key
に渡してあげればOKです。
ちなみにAPI Keyを使用してmatchを実行した際にプロビジョニングプロファイルが存在せず、自動生成されるとApp Store Portalから確認できる作成者がAPI Key:XXX...
となります。
開発者メンバーと管理者で分ける
match
アクションではApp Store Portalにデバイスが新規登録された場合にそれを検知して自動で再生成するforce_for_new_devicesオプションがあります。force_for_new_devices
オプションは開発者メンバー誰でもというより管理者だけが実行するような仕組みしておいた方が安全ではあるので管理者用と開発者メンバー用でレーンを分けてあげると良いかもしれません。開発者メンバーにはreadonly
をつけてあげればOKです。
またCI/CD上から動作させる場合もreadonly
を付与したmatch
を使うようにすることが公式から推奨されています。
パスフレーズを変更する
パスフレーズを変更したい場合はchange_password
コマンドを実行します。これを実行すると開発者全員に影響があるので慎重に行ってください。
プロビジョニングプロファイルを削除する
fastlane match nuke
コマンドを使用することでApp Store PortalとGitHubリポジトリで管理しているプロビジョニングプロファイルを削除することができます。基本的にこのコマンドを使用するのは期限切れなどの場合かと思いますが、使い方を間違えると全てのプロビジョニングプロファイルが削除されてしまったりするので注意してください。使い方は簡単でnuke [type]
を指定するだけです。
コマンドを実行すると削除対象の証明書がリストで表示されます。この証明書に紐づくプロビジョニングプロファイルも一緒に削除されるようになります。
最初の質問ではy
を選択してください。n
は全て削除してしまうので注意してください。y
で進むと削除対象の証明書を番号で選択できます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。