AWS SNSのiOS向けPush通知(APNs)証明書の更新手順

**更新**手順なので、既に初期設定は終わっている想定。

## Apple Developerでcerを発行
[Apple Developer Program](https://developer.apple.com/account/)にログインする。
左メニューの「Certificates, Identifiers & Profiles」をクリックする。
<img width="229" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/0f1c0bc5-1d6a-d9d5-fa12-9ef0eb33c1a9.png">

右上にある「＋」ボタンをクリックする。
<img width="329" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/e33e04b6-a81e-6710-2090-1297ca563517.png">

Production→Apple Push service SSL (Sandbox & Production)を選択する。
<img width="481" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/1cd6015d-8332-a53b-586f-1d6a2825ce7a.png">

Push通知を送りたいApp IDを選択する。
<img width="481" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/d8bdf7b5-8db8-9953-7305-278acb10bf13.png">

CSRを作れと言われるので、言われた通りにCSRファイルを作成する。
<img width="434" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/418e1790-4ff2-7ee3-5523-5ad89e65469f.png">

Mac上で「キーチェーンアクセス」アプリを起動する。
キーチェーンアクセス→証明書アシスタント→認証局に証明書を要求…
<img width="534" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/91346c0b-a36a-cabb-0d8a-3c92d770403c.png">

ユーザーのメールアドレスと通称に何か入れる。通称は英語にしておくと問題が起きにくい。
「ディスクに保存」を選択しておく。
「鍵ペア情報を指定」はチェックなし。
そして「続ける」
<img width="534" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/e03248da-593b-fe54-0db3-f02fcd6aef0b.png">

CSRが作成されました！
<img width="504" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/10faf465-c048-c5b1-9ddf-a3f07f60b436.png">

Apple Developerに戻って、先程作成したCSRファイルをアップロード。
<img width="537" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/2ddddb98-cb00-888d-f3d5-cc33a1838e8d.png">

すると.cerファイル作ったよ！と言われるのでダウンロードする。
<img width="537" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/3f959c5c-65fd-bbd6-da87-f58969ecd3dc.png">


## .p12ファイルを作成
ダウンロードした.cerファイルをダブルクリックする。
すると「キーチェーンアクセス」アプリが起動して、先程CSRを作成した際に入れた「通称」の鍵と証明書がペアになっている。
<img width="437" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/36a46dc9-68eb-f432-47dd-11d7c638f98a.png">

証明書を右クリックして、右クリックメニューから「”Apple Push Services: hogefuga”を書き出す…」を選択する。
<img width="437" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/cacbc53f-b7cc-0a79-6b2b-9503f17e0e34.png">

.p12になっているのでそのまま保存する。
ちなみにファイル名は英語にしておかないと後でエラーになる事がある。
<img width="367" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/84a624e5-da25-8d53-d6cf-b6b23318a2db.png">

保存する際にパスワードを聞かれるので、適当に設定する。
適当と言っても本当に適当に設定して忘れてしまってはいけない。
<img width="330" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/78e77fee-c224-d04c-026f-fa34687d5f8a.png">


## AWS SNSの設定の更新
AWS管理画面に入ってSimple Notification Serviceに移動する。
左メニューから「Applications」に遷移する。
<img width="232" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/86633566-38a8-a93e-2805-9d78cf64907b.png">

右欄から対象となるARNをクリックする。
<img width="532" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/08a081a5-b11b-1825-6294-b173881dd638.png">

Platform application actions→Update credentialsを選択する。
<img width="132" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/50e2855f-0123-604a-87c6-fe3198b6232d.png">

先程生成した.p12ファイルと.p12ファイル生成時に使ったパスワードを入力する。
ここで.p12ファイルが英語でなかったり通称が英語でなかったりすると、謎エラーが出て作り直しが必要な事がある。
<img width="501" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/918dffe2-706a-e1e3-2c74-2e893d76b1db.png">



## テスト
[ここ](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/mobile-push-apns.html)のsnsmobilepush.zipをダウンロードして解凍する。
`AppleMobilePushApp/iOS 8/AmazonMobilePush.xcodeproj`をダブルクリックして開く。
警告が出るけど開く。
<img width="320" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/5680d98d-be69-5e86-cf78-253e113f54b7.png">


GeneralタブのIdentity→Bundle Identifierを証明書を発行したApp IDに変更する。
<img width="511" alt="スクリーンショット 2018-06-03 15.58.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/9104/e12afdd9-8e88-94ae-ddf9-da6887cad82a.png">

Signingを合わせて変更する。ここで「！」マークが出ていたらダメ。
CapabilitiesタブからPush NotificationsをONにしておく。

適当にテスト登録している端末にインストールして起動する。
すると`Device Token = <examp1e 29z6j5c4 df46f809 505189c4 c83fjcgf 7f6257e9 8542d2jt 3395kj73>`みたいなログが出る。

このデバイストークンをAWS SNSに登録する。
Create platform endpoint→Manually add a single tokenで先程のデバイストークンを入力して「Add endpoint」。
<img width="352" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/cbf5d0e3-f251-b6cd-72be-92a4a409fca6.png">
<img width="497" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/b3f98682-0ed9-ca08-a4a7-91df2b484539.png">

その後、Filterで検索して、「Publish to endpoint」。
<img width="437" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/3e3121a6-93c3-a008-27a1-90887fe47596.png">

「Message format」を「JSON」にして、「JSON message generator」をクリック。
するとこんな感じの画面が出てくるので、テストっぽいメッセージを入れて「Generate JSON」。ここは日本語OK。
<img width="402" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/d7099f7b-309d-9e78-d21f-00de470496a8.png">


こんな感じになるので、右下から「Publish message」する。
<img width="502" alt="." src="https://qiita-image-store.s3.amazonaws.com/0/9104/d111e610-ea5f-2c98-f1ba-7bf1286ff775.png">

するとテスト端末のテストアプリにPush通知が届く。

## 所感
何かもうちょっと単純だった気がしていたけど、そんな事は無かった…