AmazonSNSとFirebaseを使ってSNSコンポーネントでプッシュ通知


AWS SNSコンポーネントを使用してAndroidアプリへプッシュ通知メッセージを送信してみます。以前はGoogle Cloud Messagingを使用していましたが、Firebaseが強く推奨されていますのでこちらを使用します。

Firebaseの設定

まずFirebaseのコンソールでプロジェクトを追加します。

ダイアログに「プロジェクト名」と「国/地域」を設定して追加します。

プロジェクトが追加されたらAndroidアプリでテストしたいので「AndroidアプリにFirebaseを追加」をクリックします。

Androidパッケージ名は、開発しているAndroidアプリのパッケージを指定してあげます。

SHA-1はAndroidアプリの開発環境でJDK1.8.0.161を使ってデバッグ用を作成しました。

設定ファイルのgoogle-services.jsonをダウンロードしてとっておきます。後で開発するAndroidアプリのappフォルダ直下に置きます。

開発するAndroidアプリのbuild.gradleを指定のように修正する必要があります。

Firebaseコンソールでプロジェクトの設定/クラウトメッセージングを開いて
プロジェクト認証情報/サーバーキーのトークンをコピーしておきます。

Firebaseで設定することは以上です。

Android Studio

Android Studioを使用してSNSからメッセージを受け取るAndroidアプリを作成します。

プロジェクトを作成します。

今回はAPI 23: Android6.0(Marshmallow)以上を選択します。

空で作ります。

プロジェクトのフォルダが作成できたら、さっそく先ほどダウンロードしたgoogle-services.jsonをappフォルダ下に移動します。

build.gradleも修正しておきます。
SDKのバージョンを変更して、firebaseのcompile行を追加します。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "com.infoteria.snsapp"
        minSdkVersion 23
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])
   implementation 'com.android.support.constraint:constraint-layout:1.0.2'
   compile 'com.google.firebase:firebase-core:11.8.0'
   compile "com.google.firebase:firebase-messaging:11.8.0"
   compile 'com.android.support:support-v4:27.1.0'
   compile 'com.android.support:support-compat:27.1.0'
   compile 'com.android.support:appcompat-v7:27.1.0'
   compile 'com.android.support:animated-vector-drawable:27.1.0'
}
apply plugin: 'com.google.gms.google-services'

Android StudioのメニューTools/Firebaseからソースのチュートリアルを見れます。

Tokenを取得方法は
 FirebaseInstanceId.getInstance().getToken();
このTokenはSNSでアプリケーションのエンドポイントで使用するトークンです。

Log.d(LOGNAME, "firebase instance token: " + FirebaseInstanceId.getInstance().getToken());

Firebaseのメッセージ受け取りは
FirebaseMessagingServiceクラスを作成し、onMessageReceivedで受け取ります。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
  Log.d(LOGNAME, "From: " + remoteMessage.getFrom());
  String messageBody = "Empty Message !";
  if (remoteMessage.getData().size() > 0) {
    Log.d(LOGNAME, "--Message Data--");
    java.util.Map<String, String> message = remoteMessage.getData();
    //長かろうが、短かろうが処理する
    StringBuilder sb = new StringBuilder();
    for (java.util.Map.Entry<String, String> entry : message.entrySet()) {
      sb.append(entry.getKey()).append("=")
      .append(entry.getValue()).append("\n");
    }
    messageBody = sb.toString();
  } else if (remoteMessage.getNotification() != null) {
    Log.d(LOGNAME, "--Notification Body--");
    messageBody = remoteMessage.getNotification().getBody();
  }
  Log.d(LOGNAME, messageBody);
  sendMessage(messageBody);
}

sendMessageメソッドでUIの方へ取得したメッセージを渡しています。

FirebaseMessagingServiceクラスはAndroidManifest.xmlへサービスとして追加しておきます。

<service           
  android:name=".SNSAppMessagingService"
  android:label="SNSAppMessagingService" >
  <intent-filter>
   <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter>
</service>

ビルドが通ったら、Android Studioの作業は以上になります。
Virtual Devicesでアプリを起動しておきます。

SNSの設定

FlowのSNSコンポーネントで全てできるので、AWS SNSダッシュボードで行う作業はとくにありません。

Flowの作成

1.まずSNSコンポーネントの動作のおさらい

  • メッセージの送信はAWS SNSPublishコンポーネントで行うが対象はトピックのみである。
  • メッセージはTextストリームのみ対応していてる。これはメッセージ形式Rowに対応しているがJSONには対応していないということ。

※SNSを操作できるAWSコネクションは作成済の前提です。

2.コンポーネントでやること

  • AWS SNSCreateTopicコンポーネントでトピックを作成

 「トピック名」プロパティに名前を設定し、実行後にトピックARNを外部変数セットなどに保持しておきます。
 ※トピックARNは後でSubscribeするときやPublishするときに使用します。

  • AWS SNSCreateEndpointコンポーネントでアプリケーション(GCM)を作成

AWS SNSCreateEndpointコンポーネントをダブルクリックするとアプリケーションのリストが表示され、アプリケーション(GCM)を作成することができます。
アプリケーション名は任意ですが、APIキーはFirebaseコンソールからコピーしておいた「サーバーキーのトークン」を指定します。

  • AWS SNSCreateEndpointコンポーネントでAndroidアプリが動作するデバイスのエンドポイントを作成

Androidデバイスでアプリ実行時に取得するトークンが必要になります。今回は簡単にログでトークンを出力するようにして、Android StudioのLogcatからコピーして取得します。

  • AWS SNSSubscribeコンポーネントでトピックへエンドポイントをapplicationプロトコルのサブスクリプションとして登録

「トピックARN」プロパティ:保持しておいたトピックARNを指定
「プロトコル」プロパティ:「application」を選択
「エンドポイントARN」プロパティ:保持しておいたエンドポイントARNを指定

  • AWS SNSPublishコンポーネントでプッシュ通知メッセージの送信

AWS SNSPublishコンポーネントで送信するメッセージをTextストリームで渡します。
「件名」プロパティはサブスクリプションのプロトコルがapplicationのときは使用されませんが、必須プロパティなので何か設定します。

Flowの準備は以上です。

Flowの実行

作成したFlowを順に実行していき、トピック、アプリケーション、エンドポイント、サブスクリプションを作成します。

最後にプッシュ通知メッセージを送信します。

「SNSPublish from Flow Component 22:34:45」というメッセージを送信しました。

Androidデバイスのでdefaultの値としてメッセージを受信できました。

SNSのコンポーネントからGCMと同じようにFirebaseのプロジェクトに設定されているAndroidアプリへプッシュ通知メッセージを送信することができました。