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




## 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)で動作を調べる。
サンプルは[ここから](https://github.com/daffodilistic/aws-snsmobilepush)ダウンロードできます。

####GCMへの登録部分

```Java: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でパーミッションを登録が必要です。

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

####プッシュメッセージを受け取る部分
```xml: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>
```
```Java: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からメッセージを取得するだけ。

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

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

```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の管理コンソールから直接プッシュすることができます。