Xcode14時代の証明書管理のベストプラクティス

# はじめに

今回はiOSアプリ開発者の頭を悩ませる証明書管理のベストプラクティスについて記事を書こうと思います。


# 結論

まず結論からですが、xcodeの`Automatically manage signing`を有効にして手動での証明書管理をやめましょう！
（所属する組織の人数規模や管理するアプリ数によって状況が異なるため、一概には言えないので詳細は後述する内容をお読みください）


# 前提

この記事を読むにあたっての前提です。

### 想定読者
  - iOSアプリ開発に必要な証明書管理の知識がある程度ある人（証明書についての詳細な説明は記載しません）

### 本記事で紹介する手法がマッチする対象者
  - 個人アプリ開発者
  - iOS開発者が20人程度以下、管理するアプリが数個ほどの小〜中規模組織
    - 組織のApple Developer Programアカウント に 開発者個人のアカウントを紐付けて運用可能なこと
    - Apple Developer Programアカウントが開発用、ストア公開用などに分かれて運用していないこと

### 環境
  - Xcode14.2 (14C18)


# Automatically manage signing について

Automatically manage signing を有効にすることで、実際にどのように証明書（プロビジョニングプロファイル含む）が管理されるかを説明します。
開発用証明書、配布用証明書によっても変わってくるのでそれぞれ説明します。

## 設定手順

### XcodeにAppleIDを登録

Automatically manage signing で証明書を自動管理するには、Apple Developer Programに参加済みのAppleIDをXcodeに登録する必要があります。会社などの組織に所属している場合は、個人のAppleIDを組織のApple Developer Programに招待してもらう必要があります。（権限はDeveloper以上）
メニューバーから「Xcode」→「Preferences」→「Account」→「＋」からAppleIDを追加します。
![スクリーンショット 2022-12-16 17.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33433/f1526972-334f-d693-0044-efb932b62cc9.png)
[参考](https://help.apple.com/xcode/mac/current/#/devaf282080a)

### Automatically manage signing　の有効化

Xcode14.2では新規プロジェクト作成時にはデフォルトで有効となっています。
もし、既存のプロジェクトで無効になっている場合は「プロジェクト設定」→「Target」→「Signing & Capability」からチェックボックスを有効にします。
![スクリーンショット 2022-12-18 2.29.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33433/21129acf-208b-4778-5554-5b85303ee4c1.png)
[参考](https://help.apple.com/xcode/mac/current/#/dev23aab79b4)

## 開発用証明書について

開発用証明書は開発中アプリを実機で実行するために必要となるものです。Automatically manage signingを有効化している場合は、Xcodeが自動的に開発用証明書を作成し開発マシンのKeyChain内で管理されるため、開発者自身が意識して管理する必要がなくなります。

また、実機にインストールするには対象となる実機をApple Developer Programに登録し、プロビジョニングプロファイルを更新する必要もありますが、そちらもXcode上で行うことができます。

デメリットとしては、個人単位で開発用証明書が作成されてしまうため開発者が多い組織の場合、Apple Developer Programサイト上に大量の開発用証明書が表示されてしまうことや、気軽に実機登録できてしまうため登録台数の上限に達しやすいことなどが挙げられます。

## 配布用証明書について

配布用証明書はAppStoreに提出するバイナリの署名に利用され、信頼できる開発者の元でビルドされたことを証明します。Xcode13以降からは配布用証明書の管理・署名をクラウド上で行うこと(cloud signing)が可能となり、開発者自身の手元で管理する必要がなくなりました。
以下に、cloud signingを利用する手順を記載します。

参考: [WWDC21](https://developer.apple.com/videos/play/wwdc2021/10204/)

### ローカルマシンでの利用

ローカルマシンでcloud signingを利用してipaファイルを作成するには、AppStoreConnectの「User and Access」から必要な権限を付与する必要があります。AccountHolder,Adminであれば利用可能であり、Developerの場合は個別に「Access to to Cloud Managed Distribution Certificate」にチェックを入れることで利用可能となります。
![スクリーンショット 2022-12-18 0.51.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33433/b8f4c1fd-8d02-43f9-8ea8-4aa45f97bcce.png)

「Organizer」から対象のArchiveを選択し、「Distribute App」からAppStoreConnectへの配信作業を進めます。
途中で「Re-sign」のフローが表示され、そこで「Automatically manage signing を選択することで、自動的にクラウド上で署名作業が行われます。
その後の検証作業で問題がなければ、通常通りAppStoreConnectへipaファイルがアップロードされます。
![スクリーンショット 2022-12-18 1.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33433/ffc6b0df-1ac1-d1e3-33b2-0fd56c3d79c6.png)

### CI/CDサービスでの利用

cloud signingはGitHub ActionsなどのCI/CDサービスからも利用する事ができます。従来であれば配布用証明書・プロビジョニングプロファイルをCI/CD上のマシンにインストールするタスクが必要でしたが、cloud signingを利用するとそれが不要になります。

CI/CDサービス上でcloud signingを利用するには、AppStoreConnectの「User and Access」からAdmin権限のAPIキーを発行する必要があります。
詳細は省略しますが、`xcodebuild`コマンドのオプションでAPIキーの情報を渡してあげることで、コマンドラインからcloud signingを利用できます。

```
$ xcodebuild -exportArchive \
    -archivePath <対象のarchiveのパス> \
    -exportPath <ipaをexportするパス> \
    -exportOptionsPlist <ExportOptions.plistのパス> \
    -allowProvisioningUpdates \
    -authenticationKeyIssuerID <issuerID> \
    -authenticationKeyID <APIKeyのID> \
    -authenticationKeyPath <APIKeyのパス>
```

fastlaneを利用している場合は、gymアクションの`xcargs`パラメータに上記APIキー情報のオプションを指定することでcloud signingを利用できます。

# まとめ

Automatically manage signingを利用して、煩わしい証明書管理から開放されましょう！