Automatically manage signingとxcconigで超効率化

筆者の父は、ブラウン管のテレビを購入した当日からネジの一本レベルまで解体・解析し、組み立て直してから使うという剛の者であった。
そんな彼が好んで取り組んだテーマが「家電の自動化改造」である。

例えばリビングの石油ファンヒーターについては、予熱から点火を終え送風ファンが回転を始めたタイミングで、部屋の隅々の小型扇風機に自動でスイッチが入り、ヒーターと連動した運転を開始するといった具合だ。
これを昭和の時代、完全に「暇つぶし」の一環として実現していた事実には驚きを禁じ得ないが、部屋中が新聞紙とネジ・油塗れになる「家電解体ショー」の定期開催については、家族として甚だ迷惑だったと記憶している。

----

※補足記事: [超効率化外伝: xcconfigの便利なところ＆設定例](
http://qiita.com/rotors123/items/1affd9a286505536e809)も併せてお読み頂くと幸いです。

----

## 本題

今回はXcodeの以下の2つの機能をうまく組み合わせて、開発時に手間のかかる作業や管理を自動化・効率化して幸せになろう、という試みとなる。

- Automatically manage signingで、証明書周りやビルド、申請作業向け作業の大部分をXcodeに任せる
- xcconfigで主要なビルド設定を設定ファイル化

手順は少々複雑だが、効果は絶大だ。

**Automatically manage signing利用の効能:**

> Certificates, Identifiers & Profiles（長いので以降「Potal」と呼称）にログインする事無く、以下の作業が自動化される上、Xcode側への紐付けまで行ってくれる。
> 
> - プロビジョニング向け証明書作成
> - リモート通知向け証明書作成（必要時）
> - App IDsの作成
> - （Debug Configuration時） Devicesの追加作業
> - プロビジョニングプロファイルの作成・更新作業（開発用／申請用）

**xcconfig利用の効能:**
> 
> - アプリの設定をXcode側のUIではなく、シンプルな設定ファイルで設定・管理可能となる。
> - アプリの量産に有利。一つのTARGETだけで柔軟な管理が可能。
> - ついでに、共同開発時におけるXcodeの構成ファイル変更によるgitのconflict等も防げる。

但しハマリどころが多く、諸刃の剣でもある。

以下は筆者が実際に一部の業務でも使っている手法だが、試す場合はあくまでも自己責任でお願いすると同時に、より効率的な、安全な方法について情報があれば、コメント欄で情報提供をお願いしたい。

※ 詳細のキャプチャなどは後ほど追加していく予定です。

## バージョン情報
Xcode：8.３.3

## 事前に注意する点

- Xcodeを信じる。但しは過信は禁物。
- XcodeではTargetのビルド設定周りを、「Automatic manage signing」のチェックとTeam IDの指定以外、極力手動でさわらないこと。できる箇所は全てAutomatic manage signingまたはxcconigにやらせる。
- 一連の作業を終えるまでは、**Potal側で手作業を一切行わない**覚悟で（特にApp IDの追加）。
- Potal側でXcodeを使わず手動で行うのは、唯一リモート通知機能が必要なアプリの場合等、最後に通知用の証明書を設定するところのみと考えておくと良い。
- iTunes Connectでのエントリ作成はXcode側での作業が全て完了した後に実施すること。[注意点1](#注意点1)
- Bundle IDとSKUの設定作業は一期一会の精神で取り組むこと。[注意点2](#注意点2)

## 手順

1. 対象のxcconfigファイルを作成。詳細については[こちらの記事参照。](http://qiita.com/rotors123/items/1affd9a286505536e809)

2. Xcodeに1のファイルを紐付ける。

3. PROJECT-ConfigurationsでDebug, Releaseの[ターゲット名]のConfigurationファイルを割り当てる。
<img width="689" alt="スクリーンショット 2018-01-23 16.03.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/187895/59499ff8-e5ae-18ab-864d-2d2d0367bffe.png">

4. TARGETS: [ターゲット名]のSigningを開き、エラーが出ている場合は「Automatic manage signing」のチェックをオフ・オンする。「Automatically manage signing will reset」が出た場合は「Enable Automatic」を選択。　
<img width="454" alt="スクリーンショット 2018-01-23 17.44.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/187895/9f582319-8e89-c33a-8a16-8fe748b71d1c.png">
__※注意事項: この際、もし「Revoke」というボタンが表示された場合、安易には押してはいけない。__ これは証明書を再作成するものであり、本来の正しいものが存在する場合にそれが無効化され、強制的に書き換えられる可能性がある為である（詳しくは管理者に確認されたし）。以降の作業でも同様。

5. Bundle IDがxcconfigで指定されたものになっている事を確認。

6. 複数Teamに所属している場合のみ:　Teamが想定したものになっている事を確認。未割り当ての場合は手動で割り当てる。[注意点3](#注意点3)

7. リモート通知を利用するアプリの場合、Capabilities - Push Notificationsがエラー又は外れていた場合は再度オフオンを実施する。
※「.entitlements」ファイルが作成されていない場合もオフオンを行う事で自動的に作成される。

ここまで行い問題が無ければ、ビルド・実行が可能になるはずだ。
以上までが基本的な「一連の作業」となる。

この後、iTunes Connectでのエントリ作成は手動で実施（[注意点4](#注意点4)）することで、TestFlightでの配布や申請作業が可能となる。はずだ。

## 補足:

# 注意点1

例えば無理矢理Potalにて手動でApp IDを定義して、先にiTunes Connect上でエントリを用意すると、紐付けに問題が出る可能性がある。以下も参照のこと。

# 注意点2

Bundle ID自体はアプリが審査で承認されるまで変更可能だが、「Bundle IDとSKUの組合せ」については、iTunesConnect側の最初の設定一発で決まり、やり直しが効かない。
[参考: iTunes Connect デベロッパガイド](https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_Jpn/Appendices/Properties.html)

# 注意点3

もし複数の組織（Team）に所属しているApple IDでサインインしている場合、想定外の別Teamに強制的にApp IDが割り当てられ絶望する場合がある。
→ その結果、Xcode上に「Failed to create provisioning profile.」「No profiles for “(Bundle ID)” were found」と表示され、割り当てが失敗する。
→ この時は、まず「無極」で落ち着き、直ぐに想定したTeamに割り当てた後、想定外の別Team側のApp IDsで意図せず作られた「XC (Bundle ID)」のエントリを削除した後にTry Againをポチる事で、復旧が完了する。

ちなみに、xcconfig側でTeamを指定、つまり「DEVELOPMENT_TEAM = xxxxxxxxxx」としても、現状はAutomatic manage signingでうまく反映されず、無視されるようだ。
Automatic manage signingを利用しない場合は反映されるので、Xcode側の対応が待たれるところだ。

# 注意点4

「新規 App」の「バンドルID」欄に、設定したBundle IDが表示されず選択できない場合がある。
iTunes Connectで再サインインを試みても状況が変わらない場合は、時間が解決する…という情報もあったが、筆者の場合は以下の手順を踏んで解決し、申請に至った。（情報募集中です）

- Potal上で、自動で作られたApp ID 「XC (Bundle ID)」を削除する。
→ この段階で、App IDs/プロファイルが削除される。
- XcodeのAccount設定から該当のApple IDを削除し抜ける。
- Automatically manage signingのチェックを外す。
- Xcodeを再起動。
- XcodeのAccount設定から該当のApple IDを改めて追加する。
- Download All Profilesを実施
→ この段階で、なぜか該当アプリのApp IDs/プロファイルが復活。

それでは、良い旅を！