Firebase Cloud MessagingをiOSアプリで利用するための設定 (2017)

# はじめに
iOSアプリケーションでのFirebase Cloud MessagingはAndroidの利用と比べて設定手順が多く、手順を一つでも間違うと通知が来ないという問題に直面します。この問題にあたった場合はほとんどの部分が自分で作成していない部分となるためデバッグができないため、設定ミスを起こさないようにログを残しておきます。

# FCM(Firebase Cloud Messaging)とAPN(Apple Push Notifications)
まず設定の前にFCMとAPNsの関係を整理しておきたいと思います。My Serverからの通知はFirebaseを通してAPNに通知され、APNから各iPhone端末に通知されます。Firebaseを利用しなくてもAPNを利用すればサーバーからのPush通知は可能ですが、iOS/Androidの両方に通知を行うためにFirebaseを利用している方が多いかと思います。

注意する点としては、APNにはsandboxとproductionの両方があることです。sandboxは開発用で開発PCと開発端末での利用に用います。<font color="DeepPink">それ以外はTestFlightも含めてproductionを利用しないと通知が届きませんので注意が必要です。</font>

<img width="766" alt="スクリーンショット 2017-03-05 16.08.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/d4d2097c-ece3-5c77-908c-ab3e715076e2.png">

FirebaseからAPNへの通知にはsandbox/productionのSSLの証明書の設定が必要になります。単純にサンプルを動作させるだけであればsandboxで十分なのですが、正式なアプリケーションで後々必要な場合は、一気にsandboxとproductionの両方を設定してしまいましょう。

# CSRの作成
APNの証明書はApple Developers Programで作成する必要があります。証明書を作成要求のためにCSR(certificate signing request)を作成しましょう。

sandboxとproductionのCSRを共有することも可能だと思いますが、ここは正しく、それぞれのCSRを作成しましょう。

開発用Macでキーチェーンアクセスを起動します。認証局に証明書を要求を選択。

<img width="491" alt="スクリーンショット 2017-03-05 16.24.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/7537d0d6-d0a2-ce85-313e-f8c9deda554b.png">

メールアドレスを入力。ディスクに保存、鍵ペア情報の指定を選択
<img width="728" alt="スクリーンショット 2017-03-05 16.25.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/3e5fdb49-6ba7-d37a-173c-02c336b77023.png">
<img width="728" alt="スクリーンショット 2017-03-05 16.27.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/2307ef12-f20a-ddc1-fe48-833e92df4ffe.png">

作成したCSRファイルを保存しておいて下さい。同じ手順をもう一度行い、Production用のCSRも作成して下さい。

# APN証明書の作成
App IDを取得します。。App ID取得時に以下の"Push Notifications"を選択して下さい。(あとから編集することも可能です）

<img width="524" alt="スクリーンショット 2017-03-05 16.47.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/2be3b85a-bec6-2943-50a7-88c82fb4ce86.png">

## 開発用(sandbox)のAPN証明書の作成
<img width="814" alt="スクリーンショット 2017-03-05 16.50.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/c450646e-e594-b405-f181-f7dfc6b6782a.png">
<img width="875" alt="スクリーンショット 2017-03-05 16.50.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/9bc7249c-993e-bd09-a4f4-77add41214d2.png">
<img width="814" alt="スクリーンショット 2017-03-05 16.51.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/bb1e8eba-163e-707c-048d-45a4e5944ec8.png">

先ほど作成した開発用のCSRを選択します。

<img width="699" alt="スクリーンショット 2017-03-05 16.51.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/4962e359-ee9e-dcb3-6ce0-9523768131c9.png">

<img width="789" alt="スクリーンショット 2017-03-05 16.52.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/69f44be3-d3d0-0613-bf3b-c0672a42df9c.png">

<img width="804" alt="スクリーンショット 2017-03-05 16.52.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/a7a56df7-7558-7652-99ca-d9a39fef7631.png">

ダウンロードするとaps_development.cerが作成されます。

## 製品用(production)のAPN証明書の作成
ほぼ同じ手順ですが、証明書の種類の選択だけ異なります。

<img width="707" alt="スクリーンショット 2017-03-05 16.59.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/e66e8679-642c-222d-957d-8bff98d2c615.png">

<img width="796" alt="スクリーンショット 2017-03-05 16.59.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/1e5cfa24-17ca-e4d6-cd06-3873e3a6e2e7.png">

<img width="785" alt="スクリーンショット 2017-03-05 17.00.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/0d2d6cc6-e461-0e28-a566-7110c51f897b.png">

<img width="809" alt="スクリーンショット 2017-03-05 17.00.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/2255ec0e-7936-4c6f-25bb-b614ebd0dfcf.png">

ダウンロードするとaps.cerというファイルが作成されます。

先ほど作成したApp IDを選択すると"Push Notifications"が両方Enabledになっていれば正しく設定されています。

<img width="798" alt="スクリーンショット 2017-03-05 17.02.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/67096c6c-2793-fcb3-b87f-8af6dd7bd31a.png">

# 秘密鍵の取り出し
Firebaseへの設定には、それぞれの証明書の秘密鍵を設定する必要があります。それぞれの証明書の秘密鍵をキーチェーンアクセスを用いて取り出します。

aps_development.cer、aps.cerの両方のファイルをダブルクリックします。そうするとキーチェーンに保存されます。

鍵を書き出します

<img width="490" alt="スクリーンショット 2017-03-05 17.12.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/a7226cf3-7185-9e7f-9bfe-ada1fb9738a6.png">

パスワード設定します
<img width="556" alt="スクリーンショット 2017-03-05 17.10.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/e0e0864c-d0b1-5577-f01d-bc5d329b70d4.png">

XXX.p12ファイルが作成されます。同じようにproduction用の秘密鍵も取り出します。

<img width="528" alt="スクリーンショット 2017-03-05 17.10.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/fa92cf62-ffd4-87f1-e14b-241137c7efbc.png">
<img width="556" alt="スクリーンショット 2017-03-05 17.11.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/d0a6b9b8-0f2b-5913-0a45-a04ee01ebc66.png">