LoginSignup
0
0

More than 1 year has passed since last update.

Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法9―サーバー(Amazon SNS:プッシュ通知を配信:HMS Part 1)

Last updated at Posted at 2021-05-07

Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法―サーバー(Amazon SNS:プッシュ通知を配信:HMS Part 1)

LambdaとAPI Gatewayで配信用のAPIを作成します。

Lambdaでは、aws-sdkライブラリを使って、DynamoDBに登録したHMSのトークンを取得し、それを対象にして、プッシュ配信内容をAmazon SNSのトピックに送ります。対象のAmazon SNSトピックをトリガーとして、さらに別のLambdaを起動し、プッシュ配信内容をプッシュサーバーに送ります。

プッシュ配信内容をAmazon SNSのトピックに送るLambdaのサンプル

index.js
const PushUtil = require("./pushUtil.js");

exports.handler = function (event, context, callback) {
    const pushUtil = new PushUtil();

    let pushData = event;

    const promiseArray = [];

    // Amazon SNSにアクセスするためのPromiseを作成する
    const promise = pushUtil.createHmsPushPromise(pushData.HMS, 'Amazon SNSのトピックのARN');

    promise.then((result) => {
        // レスポンスを返す
        callback(null, result);
    }).catch((error) => {
        callback(null, { error : error });
    });
}
pushUtil.js
const TokenUtil = require("./tokenUtil.js");

// AWS SDKをロードする
const AWS = require('aws-sdk');
// リージョンを設定する
AWS.config.update({region: 'ap-northeast-1'});

// SNSサービスのオブジェクトを生成
const sns = new AWS.SNS();

module.exports = class PushUtil {

    constructor() {
    }

    createHmsPushPromise(content, topicArn) {
        return new Promise((resolve, reject) => {
            const tokenUtil = new TokenUtil();
            const getTokenPromise = tokenUtil.createGetTokenPromise();

            getTokenPromise.then((result) => {
                if (result.hasOwnProperty("Items") && Array.isArray(result.Items)) {
                    content.token = result.Items.map(function(value) {
                        if (value.hasOwnProperty("token") && value.token.hasOwnProperty("S")) {
                            return value.token.S;
                        }
                        return "";
                    });
                }

                // プッシュのパラメータを設定する
                const params = {
                    // プッシュ内容
                    Message: JSON.stringify(content),
                    // 対象トピック
                    TopicArn: topicArn
                };

                sns.publish(params, (error, data) => {
                    if (error) {
                        reject(error);
                        return;
                    }
                    resolve(data);
                });
            }).catch((error) => {
                reject(error);
            });
        });
    }
}
tokenUtil.js
// AWS SDKをロードする
const AWS = require('aws-sdk');
// リージョンを設定する
AWS.config.update({region: 'ap-northeast-1'});

// DynamoDBサービスのオブジェクトを生成
const ddb = new AWS.DynamoDB();

module.exports = class TokenUtil {

    constructor() {
    }

    createGetTokenPromise() {
        return new Promise((resolve, reject) => {
            const params = {
                TableName: 'token_info'
            };

            ddb.scan(params, function(error, data) {
                if (error) {
                    reject(error);
                    return;
                }
                resolve(data);
            });
        });
    }
}

GitHub

参考

Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法
1―概要
2―クライアント(Android-GMS)
3―クライアント(Android-HMS)
4―クライアント(iOS-APNS)
5―サーバー(Amazon SNS:プッシュトークンの保存)
6―サーバー(Amazon SNS:プッシュトークンの管理:HMS)
7―サーバー(Amazon SNS:プッシュトークンの保存:HMS)
8―サーバー(Amazon SNS:プッシュ通知を配信)
9―サーバー(Amazon SNS:プッシュ通知を配信:HMS)
10―サーバー(Amazon SNS:プッシュ通知を配信:複数のデバイスに同時配信)

0
0
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
0
0