App Store で iOS アプリ公開に必要な「Certificates Identifiers & Profiles」について情報整理する

## 概要
開発した iOS のアプリを App Store に公開する際に、
Apple Developer のアカウントサイトで、「Certificates Identifiers & Profiles」 というページで色んなファイルを生成してアップしたり開発PCを紐付けたりと、ゴニョゴニョ作業が必ず発生します。

その際、それぞれが何のために必要で、実施何をしてるのかイマイチわからなかったので、情報整理するための備忘録です。（より詳細な公式説明は全て英語だったので、日本語で残しておく）

## 前提

- アプリのリリースには、そもそも Mac （厳密には、「Xcode」というソフト）が必要です。
- 以下の全ての作業は、「Apple Developer Program」（有料）に登録が完了し、開発者アカウントが有効になっている必要があります。
- 作業をする際には、使用するPCをAppleのWebサービスが関連づけ処理をおこなうたまインターネットに常時接続されている必要があります。
- 文書量が多くなるため、できるだけ具体的な手順については割愛します。


## 作業の流れ（個人的な推奨）
「Certificates Identifiers & Profiles」においては、以下の順番で行うのが一番スムーズかと。

1. 「Devices」：実機テストに使用するデバイスの事前登録
1. 「Identifiers」：アプリ毎のユニークID登録（App ID登録）
1. 「Certificates」：署名証明書の発行（＋開発マシンのキーチェーンアクセスに反映）
1. 「Profiles」：プロビジョニング・プロファイルの発行（＋開発マシンのXcodeに反映）

なので、この順番に説明していきます。


## Devices（デバイス）について

- Device(s)とは実機テストに使用するデバイス（端末）のこと
- 開発マシンに iPhone/iPad を優先接続して、Xcode を経由してアプリの実機テストをする際に、使用するデバイスをここに登録しておく必要がある
- 一部、特定のプロビジョニング・プロファイル（後述）があれば、ここに登録していなくても動かせることはできる
- 正式にテスト用とするデバイスのみをここに登録しておけば良い

### Devices 設定の流れ

- Apple Developer アカウントサイト「Certificates Identifiers & Profiles」ページへ
- 左のメニューリストから「Devices」を選択
- 「Devices」の横の ＋ ボタンからデバイス登録フロー開始
  - 「Platform」：「iOS, macOS, tvOS, watchOS」を選択
  - 「Device Name」：何の端末かわかれば何でも良い。いつでも変更可能で、変更しても他の設定には影響しない
  - 「UDID」：macOS 本体に有線で iPhone/iPad を接続し、PCの「ファインダー」から iPhone/iPad マークをクリックして確認可能
  - 複数のデバイスをまとめて登録したい場合は、「sample files」をダウンロードしてリストを作成して登録することもできる


## Identifiers（ID）について

- Identifier(s) とは、Apple Developer/App Store に登録されアプリ固有の識別情報のこと
  - iOS 開発においては App ID（Apple IDではないのでご注意を）のこと
- 「Description」「Bundle ID」「App Service」を設定する
  - Description：他の設定と連携する際に「アプリ ID 名」として使用される（任意の文字列）
  - Bandle ID：アプリの固有識別 ID
  - App Service：アプリが使用する連携・拡張機能（例：プッシュ通知、ApplePay決済、Game Center など）
- Bundle ID は、アプリの公式Webサイト等がある場合、リバースドメイン（ドメイン名をひっくり返した形）で作ることが推奨されている
  - ドメインがない場合は、適当に作る
  - Firebase 等のクラウドサービスでも、接続設定ファイル生成時に使用する
- App Service は選択式で、一覧から「Capabilities」列をチェックして設定する
  - アプリ申請内容に無い機能を指定していると、リジェクトされる可能性がある
- Xcodeが自動で App ID を作成してくれることがあるが自分でも決められる
  - Xcodeが作った App ID は「XC」から始まる

### Identifiers 設定の流れ

- Apple Developer アカウントサイト「Certificates Identifiers & Profiles」ページへ
- 左のメニューリストから「Identifiers」を選択
- 「Identifiers」の横の ＋ ボタンから設定フロー開始
  - 「App ID」を選択、次の Type は「App」を選択
  - 「Description」：任意で良い（英数字のみ）。いつでも変更可能で、変更しても他の設定には影響しない
  - 「Bundle ID」：「Explicit」を選択して、ユニークとなるIDを設定


## Certificate（証明書）について

- Certificate(s) とは、電子証明書（CER）のことで、開発マシン（PC）の正当性を外部（Apple アプリ管理側）に証明するために必要になるもの
- ちなみに、電子証明書とは、一般には、機密性の高い情報を安全にやり取りするために必要なもので、サイト（マシン）の正当性を証明するために、公に信頼された認証局（CA）が発行するデジタル証明書のこと
- **【重要】アプリと証明書の関係は、１対１の関係**
  - **つまり、開発マシン(PC)が変わると証明書を変更・引き継ぎしなければ、パージョンアップ等の対応ができなくなるので注意が必要**（引き継ぎ方法については割愛）
- 発行の流れは、大きくは「証明書のリクエスト（Mac）」▶︎「発行された証明書のダウンロード（Webサイト）」▶︎「キーチェーンアクセスに登録（Mac）」の３ステップ
- リクエストできるのは「Account Holder（アカウントホルダー）」および「Admin（管理者）」の開発者アカウントのみ
  - 証明書には内部で指定できる値でいくつかの種類がある。詳しくは、以降の表を参照
- 「Apple Development（開発テスト用）」と「Apple Distribution（製品配布用）」があるらしい
- アプリがプッシュ通知をする場合は、このフェーズで明確に指定しないといけない
  - ...が、意図的に機能として実装していなくても、結局は必要になったので指定するのが無難
  - やらないと、そもそもアプリ審査の開始ができなかった
  - Xcode のアプリ概要設定のあたりで「プッシュ通知」を追加する作業が発生
- 証明書には「有効期限」が存在する
  - 有効期限が切れた、または、無効になった場合、以下の各証明書が関連する機能・サービスが動かなくなる（プッシュ通知機能、ApplePay決済機能など）

|証明書内で指定できる値の種類|用途|
|:--|:--|
|Apple Push Notification Service証明書|プッシュ通知に必要|
|Apple Payペイメントプロセッシング証明書|AppおよびWebサイトでのApple Pay決済に必要|
|Apple PayマーチャントID証明書|WebサイトでのApple Pay決済に必要|
|Pass Type ID証明書（Wallet）|パス（ウォレット）の利用に必要（期限切れても、新規パス発行や更新以外なら使用はできる）|
|iOS配布用証明書（App Store）|iOS の新規アプリやアップデート版の、App Store への提出に必要（公開済みのバージョンのアプリには影響なし）|
|iOS配布用証明書（社内用、内部用App）|iOS のアプリの配布やバージョンアップに必要（期限切れの場合、この証明書を使用しているユーザはアプリ使用できなくなる）|
|Mac App配布用証明書とMacインストーラ配布用証明書（Mac App Store）|macOS の新規アプリ提出やアップデートに必要|
|Developer ID Application証明書（Mac App）|macOS アプリのダウンロード・インストール等に必要|
|Developer IDインストーラ証明書（Mac App）|macOS アプリのインストーラパッケージの起動に必要|
|Apple Worldwide Developer Relations Certification中間証明書|サードパーティアプリや Safari 拡張機能、プッシュ通知やApplePay決済をデベロッパが使用するための中間証明書|

### 証明書 発行の流れ

##### 証明書のリクエスト

- 専用の開発マシン(Mac)で、証明書のリクエストを macOS 標準ソフト「キーチェーンアクセス」から実行
- 「キーチェーンアクセス」の証明書アシスタントで、証明局に証明書を要求（リクエスト）する。設定項目は以下
  - 「ユーザのメールアドレス」：Apple Developer Program に登録しているメアドを登録
  - 「通称」：Apple 推奨は「Apple Developer Program 登録名と同じ個人名」だが、開発してると証明書が複数できる可能性があるので、独自に命名規約を決めて、「誰の何のマシンか、が分かる名前」が良い。
  - 「CAのメールアドレス」：入力不要
  - 「要求の処理」：「ディスクに保存」を選択
  - 「鍵ペア情報を指定」：チェック不要
- 証明書リクエストファイル「CertificateSigningRequest.certSigningRequest」が生成されるので大切に保管する（名称は任意）

##### 証明書の発行・ダウンロード

- Apple Developer アカウントサイト「Certificates Identifiers & Profiles」ページへ
- 左のメニューリストから「Certificates」を選択
- 「Certificates」の横の ＋ ボタンから証明書発行フロー開始
  - 証明書タイプを選択
  - iOS 開発用なら「Software / iOS App Development」を選択
  - iOS 製品配布用/Ad Hoc用なら「Distribution / iOS Distribution」を選択
  - 先程生成したリクエストファイルをアップロード。発行に成功したらダウンロードページが開く
  - 発行時に、証明書の有効期限が表示されるので確認
  - まとめて安全な場所に保管・管理します

##### 証明書の開発マシンへの反映

- 証明書ファイルが生成されるので、ダブルクリックでPCの「キーチェーンアクセス」に反映させる
  - 開発テスト用なら「ios_development.cer」というファイルが生成される
  - 製品配布用なら「ios_distribution.cer」というファイルが生成される
  - キーチェーンアクセスに登録されたことを確認しておく
  - Apple Developer アカウントサイトの「Certificates Identifiers & Profiles」ページにも追加されたことを確認する


## Profiles（プロファイル）について

- Profile(s) とは「App ID」「証明書」「端末の UDID」を結びつける情報のこと
  - 正確には「Provisioning Profile（プロビジョニング・プロファイル）」
  - UDID は、実機テストに使用する端末の識別番号
- これにも「Apple Development（開発テスト用）」と「Apple Distribution（製品配布用）」がある
  - その更に詳細なタイプ選択が可能。以下はその選択例
  - 開発用：カテゴリ「Development」、タイプ「iOS App Development」
  - 製品配布用（アプリ公開）：カテゴリ「Distribution」、タイプ「App Store」
  - 製品配布用（実機でテスト）：カテゴリ「Distribution」、タイプ「Ad Hoc」
  - タイプ「Ad Hoc」 は、リリース前にチーム内でテストをするためのもので、他の実機でテストできる ipa ファイルを作成する
- つまり、開発用や本番用と用途を分けて複数のプロファイルが作成できるので、App ID と Provisioning Profile の関係は、１対 n の関係となる
- プロファイル名は、任意だが、開発テスト用なのか、製品配布用なのか、わかるように命名規則を決めておくことが推奨される

### Profiles 設定の流れ

- Apple Developer アカウントサイト「Certificates Identifiers & Profiles」ページへ
- 左のメニューリストから「Profiles」を選択
- 「Profiles」の横の ＋ ボタンから設定フロー開始
  - プロファイルタイプを選択
  - 開発用なら「Development / iOS App Development」を選択
  - 製品配布用で、公開するなら「Distribution / App Store」を選択
  - 製品配布用で、他実機でテストするなら「Distribution / Ad Hoc」を選択
  - 「Select an App ID」で、事前設定した App ID を選択
  - 「Select Certificates」で、事前設定した証明書を選択
  - 「Provisioning Profile Name」：テスト用か本番用かわかる任意の名称。いつでも変更可能だが、変更すると、Apple Developサイト内では影響しないが、開発マシンへの設定・作業には影響するので、気軽に変更しない方が良い
  - 最終的に「xxx.mobileprovision」というファイルが生成されるので、ダウンロードする
- ダウンロードした.mobileprovision ファイルを、ダブルクリックで開発マシンの Xcode に反映させる
  - 実機で動作確認ができるかテストしてみる（尚、「Ad Hoc」なら、反映されたMacに接続すれば、他の実機もテストできる）


## 生成・ダウンロードしたファイルの取扱いについて

一連の作業で、生成・ダウンロードしたファイル（証明書や App ID など）やとそれに関連する Apple ID は機密性の高く、個人情報にもなり得るため、セキュリティや不正防止の観点からも適切な保護が必要。
基本的には、Apple ID はもちろんのこと、公開鍵・非公開鍵、ダウンロードした証明書は外部に公開せず安全に保管すること。
チーム開発の場合、所属する組織でしっかりとしたデータ保護の管理体制を作り、適切に管理する必要がある。

参考：「[Maintain Signing Assets（署名用アセットを管理する）（英語）](https://help.apple.com/xcode/mac/current/#/dev3a05256b8)」

## まとめ

- Certificates（証明書)は、アプリとマシン（開発者）を紐づけるもの
- Identifiers（App ID） は、Apple Developer/App Store に登録されるアプリ固有の識別情報
- Profiles（プロファイル）は、証明書と App ID を紐づけるもの
- 証明書は、発行後に Mac のキーチェーンアクセスに反映させる
- プロファイルは、生成後に Xcode に反映させる
- iOS アプリの公開には、証明書の主となる固定の Mac PC が必要。組織におけるチーム開発の場合は、リリース用の専用マシンを１つ用意した方が良いかも。
  - Xcode Cloud が正式に稼働したら、この問題はなくなるかも？？