AmazonSNSからAndroid端末にPUSH通知を送る方法

2019年に GCM から FCM への移行が行われた

 以前はAndroid端末へのPUSH送信のために Google Cloud Messaging(GCM)が使われていましたが、こちらは2019年4月11日に廃止されています。よって今からPUSH通知の送受信サービスを構築するのであれば、後継の Firebase Cloud Messaging(FCM)を使用する必要があります。もし、お客様からの依頼でシステムを構築するのであれば、場合によってはあらかじめ Firebase のアカウントを取得してもらう必要が出てきますので注意しましょう。

Firebase への登録

 Firebase への登録は Firebaseの公式サイト(https://firebase.google.com/)から行うことができます。

 登録、ログイン後、Firebase のコンソールからPUSH通知用のプロジェクトを追加します。プロジェクト作成時に、Google アナリティクスについて確認されますが、PUSH通知を使うだけ出れば無効にして構いません。

 プロジェクト作成後に、設定の歯車マークから
プロジェクトを設定>全般>マイアプリ
の「最新の構成ファイルをダウンロード」の横に google-service.json をダウンロードするボタンがあります。こちらも、お客様からの依頼で構築する場合、かつFirebaseが最終的にお客様管理となるのであれば、予めパッケージ名を認識合したうえで、google-service.json の提供を受けましょう。google-service.jsonを受け取った後に、ファイルを直接編集したパッケージ名を変更することもできますが、ヒューマンエラーのもととなるのでお勧めはしません。

 また、設定にはSHA 証明書フィンガープリントを設定する欄がありますが、PUSH 通知を使用するだけであれば SHA 証明書フィンガープリントは不要ですので空欄にしておきます。

AmazonSNS のようなメッセージングサービスを利用する

 Firebase はそれ単体でPUSH通知を送信することができますが、画一的なPUB/SUBの仕組みや、Firebase 単体だと対応ライブラリが限られてくる(例えばPHPだとFirebase Admin SDK for PHP)などから、メッセージングサービスとしてAmazonSNS(Amazon Simple Notification Service)越しに使用します。

 注意点として、対モバイルデバイスという観点では、Firebase(FCM) はそれ単体で動作しますが、AmazonSNS は、FCM や APNs との組み合わせでしか動作できないという点を認識する必要があります。「Provider FCM」や「Provider APNs」で検索すると、概念図が出てくると思いますが、この概念図のProvide部分を担うサービスがAmazonSNSです。

AmazonSNS に登録する

 AmazonSNS は他のAWSサービス同様、AWSのアカウントと、AmazonSNSの使用権限があれば使用できます。(AmazonSNS専用のアカウントがあるわけではないことにご注意ください)。AmazonSNS のコンソールには下記サイトからアクセス可能です
https://aws.amazon.com/jp/sns/

AmazonSNS でPUB/SUBの準備をする

 AmazonSNS は PUB/SUB 方式のメッセージングサービスなので、Publish、Subscribe 用のエンドポイントが必要となります。このエンドポイントを管理するためのグループがトピックです。ただし、モバイルデバイスのアプリケーションに対してトピックを作成するためには、プラットフォームアプリケーションの作成が必要となります。順番としては
プラットフォームアプリケーションの作成→トピックの作成→トピックに対してサブスクライブとなります

AmazonSNSでのプラットフォームアプリケーション作成

 Androidデバイスに対してPUSH通知を送るため、AmazonSNS のコンソール(ホーム画面)に遷移し、左サイドメニューからMobile>プッシュ通知 の順に選択します。その後『プラットフォームアプリケーションの作成』ボタンをクリックすると、プラットフォームアプリケーションを作成するために下記項目の入力画面に遷移します。

  • アプリケーション名
  • プッシュ通知プラットフォーム
  • イベント通知 – オプション
  • 配信ステータスのログ記録 – オプション

 この内、必須となるのはアプリケーション名と、プッシュ通知プラットフォームです。アプリケーション名は任意のもので問題ありませんあ、プッシュ通知プラットフォームについては、Android 端末への通知であれば Firebase Cloud Messaging(FCM)を、iOS 端末への通知であれば、Apple iOS/VoIP/MACを選択してください。あとの項目についてはオプションとなりますが、配信ステータスのログ記録については設定しておくと、PUSH通知が送れない、届かないというときに解析に有用なログが取得できるので設定しておくことを推奨します。

 『Firebase Cloud Messaging(FCM)』を選択するとFirebase Cloud Messaging の認証情報としてAPIキーの入力を促されますが、ここに何を入力するべきかは次のセクションで解説いたします。

AmazonSNS と Firebase の紐づけ

 AmazonSNSがProviderとしてFirebaseを利用するためには、AmazonSNSがFirebaseの認証情報を知っている必要があります。そのための仕組みとして、FirebaseではAPIキー(サーバーキー)を発行する機能があります。Firebaseのコンソールに移動し、PUSH通知用に作成したプロジェクトの設定で Cloud Messagingタブ→サーバーキー からサーバーキーをコピーし、AmazonSNSプラットフォームアプリケーションのAPIキー欄に入れます。

AmazonSNS のコンソール(GUI)からPUSH通知を送る方法

 AmazonSNSとFirebaseの連携ができましたので、あとはAndroid 側からSubscribeと、Provider(AmazonSNS)側からのPublishによりPUSH通知が実現できます。AmazonSNSには、アプリケーションプログラムを作成しなくても、このSubscribeとPublishをGUIから実現する方法が用意されています。(ただし、Android端末のデバイストークンは必要となります)

 まず、プラットフォームアプリケーションを選択し、『アプリケーションエンドポイントの作成』をクリックします。次にデバイストークンの欄に、Android端末がFCMから取得したデバイストークンを入力します。そうすることで端末に通知するためのエンドポイントが作成されるので、そこで『メッセージの発行』を選び、任意のPUSH通知メッセージを作成、送信することができます。この場合にはトピックはなくとも端末に対して通知ができますが、もちろん通知用のトピックを作成し、トピックに対してデバイストークンの登録をすることでも通知が可能です。

Android 端末でデバイストークンを取得する

 Android 端末にてデバイストークンを取得するためには Android StudioなどでFCM SDK を組み込んでアプリケーションをビルドし、かつトークン生成コールバックである onNewToken にて生成されたトークンを取得、保持する必要があります。具体的な方法は下記に詳しく解説されています
https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja
 なお、アプリを再インストールするとデバイストークンはリセットされてしまいます。デバイストークンを端末固有のIDとして使用する際にはアプリの再インストールで初期化されていいかどうか、設計を検討しましょう。

AndroidアプリでPUSH通知を受け取るサービスをお考えなら

 宮城、仙台に限らず、Android への PUSH機能利用したシステムの設計開発や、導入にお困りの方や、システムの構築や見積が可能なベンダーをお探しならば、ぜひ弊社までご相談ください。新型コロナウィルス対策として、完全にリモートでのお打ち合わせなどにも対応しており、リモートで仕様検討から納品まで行わせて頂いた事例も多数ございます。

宮城県仙台市のシステム開発会社FITS
https://www.fits-inc.jp/