Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法５―サーバー(Amazon SNS：プッシュトークンの保存)

# Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法―サーバー(Amazon SNS：プッシュトークンの保存)

### Amazon SNSの準備
1. プラットフォームアプリケーションの作成
2. サブスクリプションの作成

上記の２つについて、[Amazon SNSを利用してモバイルプッシュ通知を送信するやり方ーコンソール利用](https://qiita.com/Rei_2020/items/ab1768c1a0191b73492e)をご参照ください。

### AWS Lambdaでプラットフォームアプリケーションにプッシュトークンを登録する方法

```javascript:index.js
// AWS SDKをロードする
const AWS = require('aws-sdk');
// リージョンを設定する
AWS.config.update({region: 'ap-northeast-1'});
// SNSサービスのオブジェクトを生成
const sns = new AWS.SNS();

exports.handler = async (event) => {
    const response = {};

    // 入力データを検証
    if (!event) {
        response.error = "No data";
        return response;
    }
    // 入力データを検証（トークンがない）
    if (!event.hasOwnProperty("token")) {
        response.error = "No token";
        return response;
    }
    // 入力データを検証（トークンがない）
    if (!event.hasOwnProperty("token_type")) {
        response.error = "No token type";
        return response;
    }

    const token = event.token;
    
    // FCMのプッシュトークン
    if (event.token_type == "FCM") {
        var params = {
            PlatformApplicationArn: '作成したFCMのプラットフォームアプリケーションのARN',
            Token: token
        };

        await sns.createPlatformEndpoint(params, function(err, data) {
            if (err) {
                console.log(err, err.stack); // an error occurred
                response["error"] = err;
            } else {
                console.log(data);           // successful response
                response["result"] = data;
            }
        }).promise();
    } else if (event.token_type == "APNS") {    // APNSのプッシュトークン
        var params = {
            PlatformApplicationArn: '作成したAPNSのプラットフォームアプリケーションのARN',
            Token: token
        };

        await sns.createPlatformEndpoint(params, function(err, data) {
            if (err) {
                console.log(err, err.stack); // an error occurred
                response["error"] = err;
            } else {
                console.log(data);           // successful response
                response["result"] = data;
            }
        }).promise();
    } else {
        response.error = "Invalid token type";
    }

    return response;
};
```

# GitHub
https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PushDemo(H%2BG)/AWS/Lambda/hms-push-demo-add-push-token

# 参考
<b>Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法</b>
[１―概要](https://qiita.com/Rei_2020/items/69b9d9344e6d23dea097)
[２―クライアント(Android-GMS)](https://qiita.com/Rei_2020/items/2f4424cb3a5bbf86abc3)
[３―クライアント(Android-HMS)](https://qiita.com/Rei_2020/items/9d3764fc150e0e7a8014)
[４―クライアント(iOS-APNS)](https://qiita.com/Rei_2020/items/d839753f1514338809f9)
[５―サーバー(Amazon SNS：プッシュトークンの保存)](https://qiita.com/Rei_2020/items/c2ecd5bcd3866fe7d4e4)
[６―サーバー(Amazon SNS：プッシュトークンの管理：HMS)](https://qiita.com/Rei_2020/items/5e1906e3a4d1b737a803)
[７―サーバー(Amazon SNS：プッシュトークンの保存：HMS)](https://qiita.com/Rei_2020/items/6ad6f4ef13d5155cffa7)
[８―サーバー(Amazon SNS：プッシュ通知を配信)](https://qiita.com/Rei_2020/items/6ff3c1b8d3f7f44d27f0)
[９―サーバー(Amazon SNS：プッシュ通知を配信：HMS)](https://qiita.com/Rei_2020/items/40df3519b99c80fdea3d)
[１０―サーバー(Amazon SNS：プッシュ通知を配信：複数のデバイスに同時配信)](https://qiita.com/Rei_2020/items/ee32f3caeff8257097e6)