Xcode8 - Automatic Signingで疲弊しないために

#はじめに

書いている時点でいろいろまだ手強そうなところを感じています。

これ
↓
<img width="512" alt="スクリーンショット 2016-10-01 2.00.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/d9874bbb-bdf3-26ee-2cad-c8bf5cee6721.png">

作るアプリによって、作業するMacの環境によって、開発者プログラムによって
使わない方が良いと個人的に判断している確認ポイントを書きます。

# Auto Signingに向かない場合

- Developer証明書を自動でつくられると困る
- おなじTeamで複数のAppleIDを登録している
- AppIDのPrefixを決めている（keychainに情報を保持するようなアプリ）

Developer証明書を自動でつくられると困る

>新規でプロジェクトファイルを作成してアラートが表示、OKをおしたらDeveloper証明書が作成される場合がありました


おなじTeamで複数のAppleIDを登録している

>同一のiOS開発者プログラムに入っている複数のAppleIDが同じMacのXcode8に登録されている場合、Developer証明書を自分で選ぶことができない。

AppIDのPrefixを決めている（keychainに情報を保持するようなアプリなど）

>後述します。


# アーカイブからの書き出し時の確認
<img width="668" alt="スクリーンショット 2016-09-30 23.33.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/d64703de-5cf2-c145-8cce-38ad071977c3.png">

アーカイブファイルから書き出すときに選ばれるプロビジョニングファイルは

<img width="246" alt="スクリーンショット 2016-09-30 23.32.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/9f7c0c10-6622-8c6c-fa03-2b1c895a91cd.png">

ダウンロードしているプロビジョニングファイルから選ばれます。
<img width="503" alt="スクリーンショット 2016-10-01 8.51.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/fe407bef-223e-8d1a-f815-b990cca50c4a.png">

# Provisiong File

`Certificates, Identifiers & Profiles` でつくったプロビジョニングファイルは
Xcodeにダウンロードしているプロビジョニングファイルをもとに署名がされます。

ダウンロードされていない場合は

1. Xcode経由で作成後にダウンロード
2. ダウンロード済みのものから選ばれる

## Accounts経由での取得
`Certificates, Identifiers & Profiles` でつくったプロビジョニングファイルが
Accountsで表示されない場合は
<img width="764" alt="スクリーンショット 2016-10-01 2.13.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/fa6eae7c-7486-b062-3ccf-d10b585ffd24.png">

Provisioning Filesの`Select All`にチェックがはいっているかを確認します。
<img width="647" alt="スクリーンショット 2016-10-01 2.32.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/9030699e-e82f-b3f9-bbf0-8f8a927f7a08.png">

目的のプロビジョニングファイルを作成後、デバイスが追加でされるなどがあると、Select Allのチェックが外れた状態で表示されます。チェックが外れた状態であれば、XcodeのAccountsでは目的のプロビジョニングが表示されなかったり、更新されなかったりといったことが起こります。

## `Certificates, Identifiers & Profiles`からダウンロード
<img width="732" alt="スクリーンショット 2016-10-01 2.38.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/5f463e82-fe6b-93cb-fd8a-48d1a07ce03e.png">

適用したいプロビジョイングファイルをダウンロードするとXcodeのAccountsへも反映されます。
`Select All`をチェックしていない、デバイスを限定した状態のプロビジョニングファイルでも問題なく選択されます。

~~これが、一番確実だと思っています。~~

以前の投稿にも書いたことが、あるのですが、隠れたお作法があり
http://qiita.com/nofrmm/items/2bc60313aa961baf501f

Push通知付きのアプリを間違ってtokenを渡さないように
 `*`ワイルドなAppIDを指定したプロビジョニングファイルを指定したいのに
どうしても新しいプロビジョニングファイルを作ろうとしたり(member権限だと`権限がたりない`など表示され、admin以上だとプロビジョニングファイル`XC adhoc`などが更新されたり)、:apple:と気持ちが通じない動作がいまだ見られます。

使用するProvisioing Fileをどうしても指定したい場合には最終的に`terminalからの書き出し`に頼ることも検討する必要があるように思えます。

# 書き出したipaにProvisioning Fileが設定されない

## 書き出す前に

`application-identifier`を確認します。
<img width="586" alt="スクリーンショット 2016-10-01 10.30.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/54b65878-4ddf-b8d5-a4a6-e30589356012.png">

`Certificates, Identifiers & Profiles`からAPP IDsの書き出し対象を確認します。

<img width="944" alt="スクリーンショット 2016-10-01 10.41.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/53d97007-3bf0-3908-8884-7cd1d51dbb31.png">

AppIDを追加時、デフォルトのTeamIDを選んでプロビジョニングを作ることがほとんどですが、複数のAppIDのprefixがある場合は問題が起こりがちです。

<img width="702" alt="スクリーンショット 2016-10-01 10.53.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/37f861d3-f383-2aeb-43bd-5cb3e2c1bf0f.png">

## AppIDのprefixを複数もつiOS開発者プログラム

私の場合はTeamIDとなるPrefix以外に上記のAppID Prefixを一つ別に作成しています。

これが、プロジェクトファイルを新規で作ったとしても選ばれてしまうので
Auto Signing は確実にプロビジョニングファイルを指定したい場合には使えない、と思っています。
この場合のAuto Signingを有効にした状態での対処があるのでしょうか。

アラートで表示されるとおりに
<img width="874" alt="スクリーンショット 2016-10-02 8.06.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/6dc01eda-ed1d-6548-b82d-3a372239311c.png">

残念ながら、こういった場合はAuto Signingを外す選択で回避しています。

<img width="582" alt="スクリーンショット 2016-10-02 7.58.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/43547f87-d030-161c-5501-5d77fc8bf12b.png">

## ビルド時のprefixの確認

ビルドして
<img width="344" alt="スクリーンショット 2016-10-02 8.22.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/b47797e8-eb59-1a06-c980-a2e8ca5a0e2b.png">

作成されたappファイルの置き場所を開きます
<img width="333" alt="スクリーンショット 2016-10-02 8.24.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/84095ff2-8476-735a-72ec-317dd692cde3.png">

<img width="394" alt="スクリーンショット 2016-10-02 8.29.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/6cfe618f-91ad-2e8f-2a6e-94e94e31239c.png">


Terminalを開き、codesignコマンドでprefixを確認できます。
次のように入力した状態でDrag&Dropでファイルのパスを取るのが一番簡単かと思います。

```bash
$ codesign -d --entitlements - [appファイルの置き場所]
```

入力例

```bash

$ codesign -d --entitlements - /Users/[ユーザ名]/Library/Developer/Xcode/DerivedData/ProvTest-hogehoge/Build/Products/Debug-iphoneos/ProvTest.app

```

```xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>application-identifier</key>
	<string>[AppIDのPrefix].jp.hoge.releaseTest</string>
	<key>com.apple.developer.team-identifier</key>
	<string>[TeamID]</string>
	<key>get-task-allow</key>
	<true/>
	<key>keychain-access-groups</key>
	<array>
		<string>[AppIDのPrefix].jp.hoge.releaseTest</string>
	</array>
</dict>
</plist>
```

# 他に
swiftでよくあることから
BundleIdentifierを変更してもアーカイブしたら前のBundleIdentifierのままだった
みたいなことがあります。

その場合は

Productを選んだ状態で`option`キーを押すと表示される
Product > `Clean Build Folder...`を押すとバイナリから生成し直すことができます。
<img width="235" alt="スクリーンショット 2016-10-02 8.58.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/12362/2c288ac9-c32c-1729-405a-7b6bb44fd209.png">
optionをおしながらキャプチャが取れなかったため、上記の写真はoptionを押す前の表示です。


# 参考

Technical Note TN2311
Managing Multiple App ID Prefixes
https://developer.apple.com/library/content/technotes/tn2311/_index.html

Verifying the App Binary Entitlements
https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingProfiles/MaintainingProfiles.html#//apple_ref/doc/uid/TP40012582-CH30-SW26

https://forums.developer.apple.com/thread/63172

#さいごに
Developer証明書を自動で作られたところもそうですが、ハマリどころは :apple: も知っているから対処をAlertに差し込んでいるのです。
AppIDを全削除する前に、AutoSigningを外す選択肢もありますよっと。