iOSのアプリ開発で証明書まわりでハマった事をまとめ。CSRと.mobileprovison, などなど


アプリ開発していて、証明書まわりがどうもよく理解できず、ハマってしまった。
現実の世界でも役所の書類関係はややこしい。そことはまるっきり違う世界だと思いきや、ここも書類関係のやりとりをしなくてはいけなくなる。なんとも皮肉なことだ。

##発生した現象
SignigのDebugとReleaseの所にエラーが発生しており、これが解決できないと、アプリのリリース時にアーカイブすることができない。
![E2Hsltpj.png](https://qiita-image-store.s3.amazonaws.com/0/23659/e9671684-2809-05d5-77be-d7f986495f89.png "E2Hsltpj.png")

当初このエラーを十分に理解することができなかった。

##手っ取り早い解決策
この解決策で一番簡単な方法は、SignigにあるAutomaticaly manage signingにチェックを入れることで解決することができる。
しかし、今回のアプリは前のエンジニアがプッシュ通知などで他のサービスとの証明書のやりとりを行っているため、自動化を避けたいと思った。

##証明書作業に必要な環境とそれぞの役割などなど
こういう作業で、私みたいなド素人がわからなくなってしまう原因は、冒頭に書いたように「役所仕事じゃないんだから、、、」と思ってしまうことである。
しかし、所詮人間が考えることはデジタルもアナログも変わらない。基本は使っている本人が正しい人間で正しい環境で作られたかを本人とサービスサイドで証明できれば良いのである。
そのために、ローカルの環境と自分のアカウント、さらにアプリで連携が取れればOKということらしい。

###今回起きた事象
エラー内容は二つとも同じで「Provisioning Profile "XXXXX" doesn't include signing certification "YYYYY"」とある。

最終的に成功して理解できた今回の事象は、設定したアカウントに記載漏れがあったのと、開発の証明書がアカウントと紐付けられていなかったことが原因らしい。
同じエラー表示だが、内容が違っていたことがわかった。

##Provisioning Profileって？
よくわからないのが「Provisioning Profile（プロビジョニング プロファイル）」である。これは、「今回のアプリって何するものなの？」というのをまとめたファイルだと思ってもらえれば良い。
そこに記載されているのが、証明書要求と、App ID(誰が作った）、Device（何用に作った？）だ。
これらをまとめたのがProvisioning Profile（プロビジョニング プロファイル）ぽい。

###Deviceの情報が全てチェックが入っているか？
まず確認した方が良いのは、「Provisioning Profile」のDevicesの項目が全てチェックが入っているかを確かめた方が良いかもしれない。
![Edit - iOS Provisioning Profiles - Apple Developer 2018-08-04 16-35-06.png](https://qiita-image-store.s3.amazonaws.com/0/23659/c22556d2-a7e6-267f-497f-aefb54f5f057.png "Edit - iOS Provisioning Profiles - Apple Developer 2018-08-04 16-35-06.png")

今回の場合はここの１つのデバイスにチェックが漏れていたため、エラーになっていた。
上のエラーがこれで解消された。

##アカウントに開発用証明書を加える。
下のエラーに関しては、まだ解決することができなかった。
再度エラー内容をよく読むと、「全部まとめたファイルに足りない（インクルードされていない）のがある」ようだ。
前述によってDeviceの情報は全てチェックしてあり、AppIDもそうそう変更することはない。なので一番怪しいのは証明書の部分だと推測した。

そのため、再度、開発用のMacを証明する事を行った。

###証明書要求書(Certificate Signing Request:CSR）の発行
まずは開発環境からCSRという物を発行する。これは「証明書をください」と要求する書類である。これがないと証明書自体が発行されない。
※作り方はネットに沢山情報があるので、そちらをどうぞ。

[よく分かる！iOS アプリ開発に必要な証明書ファイルの作成方法 | アドカレ2013 : SP #4](https://dev.classmethod.jp/smartphone/ios-certificates/)

これを行うと「.certSigningRequest」という拡張子の長いファイルができる。

###Apple Developerサイトで証明書(.cer)の発行
そして、できた要求書（CSR）を使ってApple Developerサイト(以降App Dev）で証明書を発行する。
これで、使っている開発環境とApple Devを繋げることになる。
発行できる数の制限があるから、なるべくわかりやすい名前にしておくこと、後ほど間違ったら不必要なものが消しやすくなる

※先ほどのサイトにApp DevでIDの設定方法が書いてある。

ここで「.cer（開発者用証明書）」というファイルが生成される。この生成されたものをダンロードして、開発環境ないで鍵となるP12を作成する。
これができると、開発環境用の鍵とApple Devには証明書（鍵穴）が存在することになる

###Provisioning Profileで鍵穴を設定する
これで、鍵穴ができたのでApple Devの「Provisioning Profile」の詳細に行くと、先ほど作った鍵穴が赤枠の部分に表示される
それを選択し、Provisioning Profileをダウンロードする。
このファイルの拡張子が「.mobileprovison」という。

![Edit - iOS Provisioning Profiles - Apple Developer 2018-08-04 16-35-06.png](https://qiita-image-store.s3.amazonaws.com/0/23659/f7d7122d-4c31-aa55-6fda-4a8d8b25350b.png "Edit - iOS Provisioning Profiles - Apple Developer 2018-08-04 16-35-06.png")

###「.mobileprovison」を同階層に設置
できた「.mobileprovison」をXcodeと同じ階層に設置して、targetから読みこむ。
ここで注意して欲しいのが、Xcodeを再起動したり、プルダウンの項目を変える事をおすすめする。反応にタイムラグがあるのか、エラーがすぐに消えない場合がある。

これで、なんとかエラーが解決でき。
とても大変だったので、今回のそれぞれのファイルの関係性などを作図してみた。
![image_csr.png](https://qiita-image-store.s3.amazonaws.com/0/23659/8291d2db-3a44-eb8d-01b2-4e3bfdb9a2c9.png "image_csr.png")