LoginSignup
1
5

More than 5 years have passed since last update.

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

Posted at

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

Firebaseの設定

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

firebaseプロジェクト.PNG

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

firebaseプロジェクト作成.PNG

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

firebaseアプリ追加.PNG

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

firebaseアプリ登録.PNG

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

firebaseアプリ登録keytool.PNG

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

firebaseアプリ登録jsonダウンロード.PNG

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

firebaseアプリ登録gradle修正.PNG

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

firebaseサーバーキー.PNG

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

Android Studio

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

androidstudio1.PNG

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

create_app1.png

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

create_app2.png

空で作ります。

create_app3.png

create_app4.png

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

add_json.PNG

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からソースのチュートリアルを見れます。

add_tools_firebase.png

add_tools_firebase2.png

add_tools_firebase3.png

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コンポーネントでトピックを作成

flow1.PNG

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

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

flow2.PNG

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

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

flow3.PNG

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

logcat.PNG

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

flow4.PNG

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

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

flow5.PNG

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

Flowの準備は以上です。

Flowの実行

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

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

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

exec_flow.PNG

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

exec_device.PNG

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

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5