Cordovaアプリに通知機能を実装するには

#はじめに
当記事は、Apache CordovaでiOSアプリとしてbuildしたアプリケーションに対して、FirebaseCloudMessagingを通して、通知機能を実装する過程について記載していきます。
当記事ではCordovaの導入部分は省略しており、機能実装のみの記事となります。予めご了承ください。

Cordovaについてざっくり概要を知りたい方は[こちら](https://press.monaca.io/bryan/2621)のページがオススメです。

##CorodovaとFirebaseを繋ぐプラグインを導入
先ず、CorodovaアプリにFirebaseを導入します。

公式が提供していたプラグインの更新が止まっており、現在は個人開発コミュニティが提供するプラグインを利用することになるのですが、年々定期的な更新の数が減っている状況で、現在は分立していたアップデートを[こちら](https://github.com/dpa99c/cordova-plugin-firebasex)に集約している模様です。（よって過去の記事を参考にすると動かないこともしばしば）
ですので、特別なこだわりがない限り、[cordova-plugin-firebasex](https://www.npmjs.com/package/cordova-plugin-firebasex#plugin-variables)の利用がオススメです。

cordovaを管理しているディレクトリ内でターミナルから下記を入力。

```
cordova plugin add cordova-plugin-firebasex
```

CocoaPod内を覗くと、必要なものが全て導入されていることが確認出来ます。

##Firebaseの設定

「Firebaseコンソール」→「設定」→「アプリを追加」から、利用するプラットフォームを追加します。

<img width="698" alt="スクリーンショット 2020-07-18 3.08.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/a5dc2025-b24a-fea0-86aa-490371a9dd22.png">

例えばiOSアプリを選択した時に表示される画面。
<img width="594" alt="スクリーンショット 2020-07-18 3.10.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/b8d2c585-e4a2-aaf7-db9b-7dcfd2d717f1.png">

こちらでアプリケーションのバンドルIDを入力し、**googeleService-info.plist**をダウンロードします。

プロジェクトの「.xcworkspace」ファイルを開き、プラグインを導入したことにより作成された、**resource/confiig**のディレクトリにダウンロードした**googeleService-info.plist**を入れたら、準備完了です。

##FIrebaseとAppleの連携
**※実装にはAppleのデベロッパー登録が必要です。**

######①[AppleDeveloperサイト](https://developer.apple.com/account/resources/certificates/list)へアクセス

######②「Identifiers」の項からApp Idを作成
※法人でApple Developer登録している人は管理者権限のアカウントのみApp Id作成ボタンが表示されます

<img width="1275" alt="スクリーンショット 2020-07-02 11.00.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/789b4fc0-046a-d40d-f5c2-7c1c309afbac.png">

通常のiOSアプリの場合は、「App」をクリック。

<img width="958" alt="スクリーンショット 2020-07-02 11.05.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/a3c22573-6499-5f68-53d9-f57c7f9d5d62.png">


######③秘密鍵の取得
Apple Developer側で行う最後の作業です。
「Keys」の項をクリックし、新しく秘密鍵を生成します。

「Apple Push Notifications service (APNs)」を指定します。
<img width="760" alt="スクリーンショット 2020-07-18 3.17.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/049261e5-440d-d2f2-4665-5e719f89ef54.png">

秘密鍵生成の対象とするApp Idを指定した後、登録をすると、秘密鍵のダウンロードページが表示されます。

こちらのダウンロードページは**一度のみ**の表示で、誤ってブラウザを閉じてしまった場合などは最初から秘密鍵を作り直すことになるので要注意です。
同ページに**KeyId**などの情報が表示されているので、ダウンロードと合わせて控えておきます。


######⑤Firebaseの設定

「設定」→「クラウドメッセージング」のページで先ほど、ダウンロードした秘密鍵を入力します。
※少し前までは証明書による認証しか出来なかったようですが、現在はGoogleも認証キーの利用を推奨しています（こっちの方が簡単😊）

<img width="490" alt="スクリーンショット 2020-07-18 3.21.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/eee4e04e-bc86-2ae9-df8a-b80e2e36d876.png">
※こちらの作業はプロジェクトオーナーしか出来ません

<img width="510" alt="スクリーンショット 2020-07-18 3.21.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/72904d81-14f0-46e2-47a0-11c769d2d6f4.png">
「.p8」のファイルのアップロードを忘れずに。

以上で、AppleとFirebaseの連携は完了です！！


##コードを書く
Cordovaアプリのハマりポイントの一つにSwiftではなく、Objective-CとしてBuildされてしまうことが挙げられると思います。
実装の参考になりそうな記事はやはりSwiftで書かれているケースが圧倒的多数で、「そもそもネイティブアプリをリリースするに当たってSwiftやFlutterへの知識が乏しいからCordovaを選んだのに・・・。もう分からん😭心折れる😭」という瞬間が何度もありました。

Objective-Cによる、通知機能の実装に関しては、[こちら](https://medium.com/@jovan2018/ios-push-notifications-14ee90df162e)の記事が大変よくまとめられており、大変参考になりました。

classディレクトリ内のAppDelegate.mのファイルに上記リンクの記事を参考にしながらコードを書きます。


##CloudMessagingのテストをする
最後に実機でBuildした上で（シュミレーターでは通知を受信できないため）、CloudMessagingから通知を送ります。
実機でアプリを起動すると、下記のように通知の許可を求める表示が出ます。

<img width="191" alt="スクリーンショット 2020-07-18 3.39.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/007d6bbe-4e98-e562-3cb2-2939b2a2ca46.png">
※もし「許可しない」を押してしまった場合でも、iPhoneの設定から変更可能です。

最後にFirebaseコンソールのCloudMessagingからテスト通知を行います。
<img width="484" alt="スクリーンショット 2020-07-18 3.43.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/1b54f576-75d0-0c43-7cf0-96a44ccec6c0.png">

<img width="292" alt="スクリーンショット 2020-07-18 3.38.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357734/7d356960-f9ca-2f98-9910-a3806a7d0966.png">
実機で上記の写真のように通知を確認できたら、成功です！！(身内ネタで通知送ってテストしていたので、全部黒塗りになってしまいました・・・スイマセン😅)


####おわりに
個人的にハマりポイントがかなり多かったので、備忘録的に実装までの流れを記事にさせて頂きました。
FirebaseCloudMessagingはCloudFunctionと組み合わせて、データベースの変更の際に通知を送れたり、ターゲティングしたユーザーだけに通知を送ることも可能です。

それでは、また😋