Help us understand the problem. What is going on with this article?

Amazon SNSを使ってGCM経由でプッシュ通知

More than 3 years have passed since last update.

Amazon SNSのモバイルプッシュを使ってGCM経由でプッシュ通知する方法のめも

GCMの設定

SNSからGCMを経由してプッシュ通知するため、まずはGCMの設定を行います。
Google Developer ConsoleでGCMを有効に設定します。

  1. Google Developer Consoleでプロジェクトを選択(または作成)
  2. APIからCloud Messaging for Androidを選択
    API_ライブラリ_-_Default_Demo_App.png

  3. APIを有効にする
    Google_Cloud_Messaging_for_Android_-_Default_Demo_App.png

  4. "認証情報"からAPIキーを作成
    認証情報_-_Default_Demo_App.png

  5. サーバーキー選択
    認証情報_-_Default_Demo_App2.png

  6. IPアドレスを指定して作成(IPアドレスを指定しないとどのアドレスからでもリクエストを受け付ける)
    認証情報_-_Default_Demo_App3.png

  7. APIキーが作成されます
    認証情報_-_Default_Demo_App4.png

GCMの設定ファイル取得

1.以下のサイトにアクセスします
設定ファイル取得
2. パッケージにAndroidアプリのルートパッケージを設定し(ここでは"gcm.play.android.samples.com.gcmquickstart"を設定)、"Choose and configure services"をクリックします
Add_Google_Services_ ___ _Google_Developers.png

3."ENABLE GOOGLE CLOUD MESSAGING"をクリックします
Add_Google_Services_ ___ _Google_Developers2.png

4."Server API Key"と"Sender ID"は後ほど利用するので保存しておきます。"Generate configuration files"をクリックします

  • Sender ID:クライアントアプリにメッセージを送信するアプリケーションサーバの認証に使用する
  • API Key:

Add_Google_Services_ ___ _Google_Developers3.png

5."Download google-services.json"をクリックして設定ファイルをダウンロードします
Add_Google_Services_ ___ _Google_Developers4.png

GCMのregist token取得

参照:Try Cloud Messaging for Android
注:最新のAndroid StudioGoogle Play Servicesが必要です。

  1. google-servicesリポジトリをチェックアウトします $ git clone https://github.com/googlesamples/google-services.git
  2. AndroidStudioでプロジェクトを開きます(google-services/android/gcm)
  3. 以下のソースを編集します
    • gcm.play.android.samples.com.gcmsender.GcmSender.java 30行目public static final String API_KEY = "[Server API Key]";
    • res/values/strings.xml 9行目<string name="gcm_defaultSenderId">[Sender ID]</string>
    • Server API Key、Sender IDは前節のGoogle Developer Consoleで取得した値を設定します
  4. appを実行します
    device-2015-08-12-104216.png

  5. 以下のコマンドを実行します./gradlew run -Pargs="こんにちは"

  6. Android端末にプッシュ通知が来ます
    device-2015-08-07-121455.png

ちなみに、サンプルアプリは起動時に"/topics/global"を購読しています。gradlewコマンドではプッシュ通知するメッセージのみを渡すと"/topics/global"というTopicにパブリッシュするので、サンプルアプリを起動した端末でプッシュ通知を受け取ることができます。
Topicではなく、特定の端末にプッシュ通知するには第二引数に[regist token]を渡します。

./gradlew run -Pargs="こんにちは,[regist token]"

このコマンドを実行すると、[regist token]の端末にのみメッセージをパブリッシュできます。
Topicについての詳細はImplementing Topic Messagingを参照してください。

registration tokenの取得

「GCMのサンプルアプリケーションの実行」で以下のようなログが出力されます。このRegistration TokenがGCMからのregistration tokenとなります。

08-07 12:01:37.960  13513-13567/gcm.play.android.samples.com.gcmquickstart I/RegIntentService﹕ GCM Registration Token: xxxxx

registration token取得のソースコードは以下になります。InstanceIDを利用してトークンを取得します。getInstanceの引数にはContextを渡します。R.string.gcm_defaultSenderIdの値はstring.xmlに設定した[Sender ID]です。

RegistrationIntentService.java(53行目)
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
        GoogleCloudMessaging.INSTANCE_ID_SCOPE, null)

メッセージ受信

PUSH通知されたメッセージを受信するにはGcmListenerServiceを拡張します。
onMessageReceivedメソッドをオーバーライドしてプッシュ通知受信後の処理を記述します。

@Override
public void onMessageReceived(String from, Bundle data) {
    String message = data.getString("message");
    Log.d(TAG, "From: " + from);
    Log.d(TAG, "Message: " + message);

    /**
     * Production applications would usually process the message here.
     * Eg: - Syncing with server.
     *     - Store message in local database.
     *     - Update UI.
     */

    /**
     * In some cases it may be useful to show a notification indicating to the user
     * that a message was received.
     */
    sendNotification(message);
}
  • ./gradlew run -Pargs="こんにちは"を実行すると、以下のようなログが出力されます
08-12 11:02:24.612   2954-17735/gcm.play.android.samples.com.gcmquickstart D/MyGcmListenerService﹕ From: /topics/global
08-12 11:02:24.612   2954-17735/gcm.play.android.samples.com.gcmquickstart D/MyGcmListenerService﹕ Message: こんにちは
  • ./gradlew run -Pargs="こんにちは,[regist token]"を実行すると、以下のようなログが出力されます
08-12 11:28:04.964   30196-2379/gcm.play.android.samples.com.gcmquickstart D/MyGcmListenerService﹕ From: [Sender ID]
08-12 11:28:04.964   30196-2379/gcm.play.android.samples.com.gcmquickstart D/MyGcmListenerService﹕ Message: こんにちは

GCMクライアントの詳細

GCMクライアント(Android)の詳細については以下のURLを参考にしてください。
Implementing GCM Client on Android

プッシュ通知

手動で通知

管理コンソールから手動でプッシュ通知を送ってみます。

  1. Amazon SNSのコンソールから[Applications]を選択し、[Create Platform Application]ボタンをクリックします AWS_SNS.png
  2. 以下を設定します
    • Application Name:任意の値(今回はSampleGCMを設定)
    • Push Notification Platform:Google Cloud Messaging(GCM)
    • API Key:GCMの設定で取得したServer API Key AWS_SNS2.png
  3. Applicationが作成されました AWS_SNS3.png
  4. 作成したApplicationを選択して[Create Platform Endpoint]をクリック AWS_SNS4.png
  5. Device tokenに「GCMのregist token取得」で取得したregist tokenを設定し、[Add endpoint]をクリックします。(User dataはエンドポイントに関連付ける任意の値でAmazon SNSはこの値を使用しません) AWS_SNS5.png
  6. デバイスを登録したら、SampleGCMのARNのリンクをクリックして「Application Details」を表示します
  7. 登録したTokenを選択して[Publish to Endpoint]をクリックします AWS_SNS6.png
  8. [JSON message generator]をクリックします AWS_SNS7.png
  9. [Message]を入力して[Generate JSON]をクリック AWS_SNS8.png
  10. GCM用のJSONが生成されるので、[Publish message]をクリックしてメッセージを送信します AWS_SNS9.png
  11. 端末にプッシュ通知がきます

device-2015-08-12-120541.png

Javaで通知

AWS SDK for Javaを利用して端末にプッシュ通知を行います。

  1. サンプルアプリケーションをダウンロードします
  2. 1を解凍し、snsmobilepush/SNSSamplesをIDEで開きます
  3. 以下を編集します
    • API Key:GCMのAPI Key
    • アプリケーション名:GCMを利用可能に設定したプロジェクト名
SNSMobilePush.java(96行目)
String serverAPIKey = "[API Key]";
String applicationName = "[プロジェクト名]";
String registrationId = "[regist token]";

4.AwsCredentials.propertiesを編集します

AwsCredentials.properties
accessKey=[Amazon SNSを利用可能なAWSのアクセスキー]
secretKey=[Amazon SNSを利用可能なAWSのシークレットキー]

5.SNSMobilePush.java(66行目)のコメントを外します

SNSMobilePush.java
sample.demoAndroidAppNotification();

6.com.amazonaws.sns.samples.mobilepush.SNSMobilePushを実行すると端末にプッシュ通知がきます
device-2015-08-13-111102.png

miyatay
opst
情報技術と社員力でお客様を成功に導く Make IT Your Success
https://www.opst.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away