Posted at

AWSのSNSを使ってAndroidにプッシュ通知する

More than 5 years have passed since last update.


GCM for Androidの準備


  1. Google Accountを取得(すでに持っている場合はそれを使う)

  2. Google Cloud Consoleで[Google Cloud Messaging for Android]を有効にします

  3. GCMを利用するアプリを登録する


    1. [REGISTER APP]でアプリを新規登録

    2. Name欄にアプリ名(例:AWS)を入力

    3. PlatformはAWSのSNSを使うので[Web Application]を選択

    4. [Register]で登録



  4. AWSのSNSを認証させるために登録したアプリの[Server Key]から[API KEY]をコピーしておく


AWS SNSの準備


  1. AWS SNSの管理コンソールで[Create and Add]から[Add a New App]を選択

  2. Application Nameを入力し、Push PlatformにGoogel Cloud Messaging(GCM)を選択。

  3. Google Cloud Messaging (GCM) CredentialsでAPI Keyの入力を求められるので、GCM準備時にコピーしたAPI Keyを入力する。


サンプルアプリの動作の検証

用意されているサンプル(AndroidMobilePushApp)で動作を調べる。

サンプルはここからダウンロードできます。


GCMへの登録部分


MessageReceivingService.java

private void register() {

new AsyncTask(){
protected Object doInBackground(final Object... params) {
String token;
try {
token = gcm.register(getString(R.string.project_number));
Log.i("registrationId", token);
}
catch (IOException e) {
Log.i("Registration Error", e.getMessage());
}
return true;
}
}.execute(null, null, null);
}

GCMインスタンスのregister()にGoogle Apiのproject numberを渡せば登録してtokenが取得できるようです。

project NumberはGoogle Cloud Consoleのトップに書かれています。

AndroidManifest.xmlでパーミッションを登録が必要です。


AndroidManifest.xml

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<uses-permission android:name="com.google.android.c2dm.permission.REGISTER" />


プッシュメッセージを受け取る部分


AndroidManifest.xml

<receiver

android:name="com.amazonaws.androidtest.ExternalReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<action android:name="com.google.android.c2dm.intent.REGISTER" />
<category android:name="com.amazonaws.androidtest" />
</intent-filter>
</receiver>


ExternalReceiver

public class ExternalReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
if(intent!=null){
Bundle extras = intent.getExtras();
if(!AndroidMobilePushApp.inBackground){
MessageReceivingService.sendToApp(extras, context);
}
else{
MessageReceivingService.saveToLog(extras, context);
}
}
}
}


intent-filterを設定するだけでいいみたいです。あとは受け取ったBroadCastのintentからメッセージを取得するだけ。

上の2つの部分を自分のアプリに組み込めば、プッシュ通知を受け取る仕組みは出来上がりです。簡単!


Androidへ通知

Rubyで通知するプログラムです。


push.rb

application_arn = <APPLICATION ARN> # 管理コンソールから

token = <TOKEN> # GCM登録時に発行されるtoken

sns = AWS::SNS.new(
:access_key_id => <ACCESS KEY ID>,
:secret_access_key => <SECRET ACCESS KEY>,
:region => <REGION>
)

client = sns.client

response = client.create_platform_endpoint(
:platform_application_arn => application_arn,
:token => token
)

endpoint_arn = response[:endpoint_arn]
client.publish(:target_arn => endpoint_arn, :message => 'hogehoge')


もっと手軽に試したければ、AWSの管理コンソールから直接プッシュすることができます。