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

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

この記事からわかること

  • iOS/Xcode自動化ツールFastlane導入方法使い方
  • Fastlane match使い方
  • 証明書(Certificates)やプロビジョニングプロファイル自動管理

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Fastlane自体については以下の記事を参考にしてください。

Fastlane matchとは?

公式リファレンス:fastlane match

fastlane matchとはiOSアプリの署名に関わる証明書(Certificates)やプロビジョニングプロファイルの管理を自動化するためのツールです。個人開発の場合は自動署名機能(Automatically manage signing)などがあるのでそれほど使うことはないですがチームでの開発やCI/CDとの統合がある場合に複雑化しがちな証明書(Certificates)やプロビジョニングプロファイルの管理を一括で請け負ってくれます。

fastlane matchでできること

※ 自動生成されたプロビジョニングプロファイルは~/Library/MobileDevice/Provisioning Profiles/の中にダウンロードされます。これは「Automatically manage signing」を使用して生成した場合と同じ保管場所になります。

既存プロジェクトへのfastlane matchの導入

既存のプロジェクトへfastlane matchを導入してみたいと思います。

  1. 証明書管理用の空のリポジトリの作成
  2. fastlane自体の導入
  3. fastlane matchのセットアップ
  4. 各環境の証明書/プロビジョニングプロファイルの自動生成

1.証明書管理用の空のリポジトリの作成

まずは証明書を管理するための空のリポジトリを用意します。今回はGitHub上に用意したいので手動でprivateなリポジトリを作成しておいてください。リポジトリ名に指定はないですがcertificatesとつけておくとわかりやすいです。

2.fastlane自体の導入

まずはfastlane自体を導入する必要があるのでプロジェクトルートでfastlane initコマンドを実行します。詳細な導入手順はこちらを参考にしてください。

$ bundle exec fastlane init

What would you like to use fastlane for?
1. 📸  Automate screenshots
2. 👩‍✈️  Automate beta distribution to TestFlight
3. 🚀  Automate App Store distribution
4. 🛠  Manual setup - manually setup your project to automate your tasks

3を選択して自動でセットアップしてもらうと楽です。

3.fastlane matchのセットアップ

続いてfastlane match initコマンドを実行します。すると管理先にストレージを問われるので1.gitを選択して次へ進みます。

$ bundle exec fastlane match init

fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
3. s3
4. gitlab_secure_files

privateなGitリポジトリを作ることをお願いされ、そのURLを問われるので先ほど作成しておいたリポジトリのURLを入力します。

Please create a new, private git repository to store the certificates and profiles there
URL of the Git Repo:[リポジトリのURL]

完了すると./fastlane/Matchfileが生成されます。URLを間違えてしまっていた場合はこのファイル内のURLを修正すればOKです。


git_url("https://github.com/USERNAME/certificates.git")

storage_mode("git")

type("development")

4.各環境の証明書/プロビジョニングプロファイルの自動生成

証明書/プロビジョニングプロファイルを自動生成するにはfastlane match [環境]コマンドを実行します。開発環境ならdevelopment、本番環境ならappstoreになります。実行するとmatch用のパスワードの入力を求められます。これはチーム間で共有するものになるので個人的なものは使わないようにしてください

$ bundle exec fastlane match development

// match用のパスフレーズを入力
Passphrase for Match storage:**********

パスワードを入力して進めるとGitリポジトリに自動でディレクトリと暗号化された証明書やプロビジョニングプロファイルが生成されます。またローカル側ではキーチェーンに証明書をインストールし、~/Library/MobileDevice/Provisioning Profiles/[UUID].mobileprovisionのような形でプロビジョニングプロファイルもダウンロードされます。

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

他の開発者メンバーがmatchでプロビジョニングプロファイルを取得する

チーム内の他の開発者メンバーがリポジトリに生成しているプロビジョニングプロファイルを取得するためにはターミナルでfastlane matchコマンドを実行します。取得したいだけの場合は--readonlyオプションを付与することでApp Store Portalへのアクセスを省略(新規作成や更新をしないように)することができます。開発メンバーには意図せず更新されないように--readonlyオプションを使用することをルール化しておいた方が良いです。

$ fastlane match development --readonly

この際に指定したパスフレーズの入力を求められます。パスワード自体はそのまま共有するかfastlaneで読み込む用の.envファイルにMATCH_PASSWORDに記載しておき、このファイルを共有する方法でもOKです。


MATCH_PASSWORD=パスフレーズ

またターミナルからのコマンド実行でも可能ではありますが--readonlyオプションの付け忘れなどもあるので後述しているFastlaneのレーンに記載する方法のはおすすめです。

Xcodeからビルドする

あまりないとは思いますが、ローカルにプロビジョニングプロファイルが取得できていればXcode側と自動で紐づいているのでプロビジョニングプロファイルを選択する箇所にmatch 環境 com.XXX.XXXXXと表示されるようになります。これを選択することでXcodeからも問題なくビルドができるようになっていると思います。

Fastlaneのレーンでmatchアクションを使用する

Fastlaneのレーンではmatchアクションを使用することで未生成であれば自動生成・生成済みであれば取得処理を行うことができます。matchアクションの引数type取得したい環境名を指定します。


# 開発用プロビジョニングプロファイルを取得する
desc "Fetch development provisioning profiles and certificates for code signing"
lane :fetch_dev_signing do
  # プロビジョニングプロファイルの取得 
  match(
    # development or appstore or adhoc
    type: "development"
  )
end

上記の場合だと証明書類のインストールの前に以下のように2ファクタ認証が必要になってしまいます。

Verifying that the certificate and profile are still valid on the Dev Portal...
Available session is not valid anymore. Continuing with normal login.
Two-factor Authentication (6 digits code) is enabled for account 'XXXXXXX@gmail.com'
More information about Two-factor Authentication: https://support.apple.com/en-us/HT204915

Please enter the 6 digit code:

App Store Connect API Keyを使用する

2ファクタ認証が必須になってしまうとチームでの開発に影響が出てしまうのでApp Store Connect API Keyを使用して認証する方式にすることで2ファクタ認証が不要になります。

作業として必要になるのは「App Store Connect APIキー(.p8ファイル)」の取得とAPIキーによる認証の実装です。作業としては以下の記事でまとめている部分と同じなので詳細は以下の記事を参考にしてください。

手順だけ紹介すると以下の通りです。

  1. App Store Connect APIキー(.p8ファイル)の生成とダウンロード
  2. fastlaneと同階層にキーを設置
  3. .envファイルを作成し、中に必要な情報を記載
  4. app_store_connect_api_keyアクションで認証(JWTの作成)

.envには以下のようにそれぞれの情報を記載します。


TEAM_ID=XXXXXXXXXX
KEY_ID=XXXXXXXXXX
ISSUER_ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
KEY_FILE_PATH=AuthKey_XXXXXXXXXX.p8 # AuthKey_XXXXXXXXXX.p8ファイルへのパス
# ↑ このパスはfastlaneディレクトリから見た位置を指定する

レーン内にapp_store_connect_api_keyアクションでキーによる認証を実装し引数api_keyに渡してあげればOKです。

# 開発用プロビジョニングプロファイルを取得する
desc "Fetch development provisioning profiles and certificates for code signing"
lane :fetch_dev_signing do
  # 認証(JWTの生成)
  api_key = app_store_connect_api_key(
    key_id: ENV['KEY_ID'],
    issuer_id: ENV['ISSUER_ID'],
    key_filepath: ENV['KEY_FILE_PATH']
  )
  # プロビジョニングプロファイルの取得 
  match(
    api_key: api_key,
    # development or appstore or adhoc
    type: "development"
  )
end

ちなみにAPI Keyを使用してmatchを実行した際にプロビジョニングプロファイルが存在せず、自動生成されるとApp Store Portalから確認できる作成者がAPI Key:XXX...となります。

開発者メンバーと管理者で分ける

matchアクションではApp Store Portalにデバイスが新規登録された場合にそれを検知して自動で再生成するforce_for_new_devicesオプションがあります。force_for_new_devicesオプションは開発者メンバー誰でもというより管理者だけが実行するような仕組みしておいた方が安全ではあるので管理者用と開発者メンバー用でレーンを分けてあげると良いかもしれません。開発者メンバーにはreadonlyをつけてあげればOKです。

# 管理者用:新しいデバイス追加後の再生成を許可
desc "Sync and regenerate development profiles with new devices (admin use)"
lane :sync_dev_signing_admin do
  api_key = app_store_connect_api_key(
    key_id: ENV['KEY_ID'],
    issuer_id: ENV['ISSUER_ID'],
    key_filepath: ENV['KEY_FILE_PATH']
  )

  match(
    api_key: api_key,
    type: "development",
    # 新しいデバイスがある場合に自動で再生成
    force_for_new_devices: true 
  )
end

# 開発者が既存の証明書・プロビジョニングを取得する専用
desc "Fetch development provisioning profiles (read-only mode) for local use"
lane :fetch_dev_signing_readonly do
  api_key = app_store_connect_api_key(
    key_id: ENV['KEY_ID'],
    issuer_id: ENV['ISSUER_ID'],
    key_filepath: ENV['KEY_FILE_PATH']
  )

  match(
    api_key: api_key,
    type: "development",
    # Apple Developer Portal に書き込まない
    readonly: true 
  )
end

またCI/CD上から動作させる場合もreadonlyを付与したmatchを使うようにすることが公式から推奨されています。

パスフレーズを変更する

パスフレーズを変更したい場合change_passwordコマンドを実行します。これを実行すると開発者全員に影響があるので慎重に行ってください。

$ fastlane match change_password

プロビジョニングプロファイルを削除する

fastlane match nukeコマンドを使用することでApp Store PortalとGitHubリポジトリで管理しているプロビジョニングプロファイルを削除することができます。基本的にこのコマンドを使用するのは期限切れなどの場合かと思いますが、使い方を間違えると全てのプロビジョニングプロファイルが削除されてしまったりするので注意してください。使い方は簡単でnuke [type]を指定するだけです。

$ fastlane match nuke development

コマンドを実行すると削除対象の証明書がリストで表示されます。この証明書に紐づくプロビジョニングプロファイルも一緒に削除されるようになります。

// 〜〜〜〜〜〜〜〜+---------------------------------------------------------------+
|               Certificates that can be revoked                |
+--------+--------------+------------+-------------+------------+
| Option | Name         | ID         | Type        | Expires    |
+--------+--------------+------------+-------------+------------+
| 1      | Apple        | XXXXXXXXXX | Certificate | 2026-05-14 |
|        | Development  |            |             |            |
|        | : XXXXXXXXXX |            |             |            |
|        | XXXXXXXXXX   |            |             |            |
| 2      | Apple        | XXXXXXXXXX | Certificate | 2026-06-28 |
|        | Development  |            |             |            |
|        | : XXXXXXXXXX |            |             |            |
|        | XXXXXXXXXX   |            |             |            |
+--------+--------------+------------+-------------+------------+

// デフォルトでは、リストされているすべての証明書とプロファイルが削除されます。
By default, all listed certificates and profiles will be nuked
// 特定の証明書とそれに関連付けられたプロファイルのみを削除しますか?(y/n)
Do you want to only nuke specific certificates and their associated
profiles? (y/n)

最初の質問ではyを選択してください。nは全て削除してしまうので注意してください。yで進むと削除対象の証明書を番号で選択できます。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

Search Box

Sponsor

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article