AWS Appsync и push-уведомления - PullRequest
       15

AWS Appsync и push-уведомления

0 голосов
/ 28 августа 2018

Я создал ионное приложение и теперь хочу добавить в него функциональность чата. Я искал разные технологии, которые можно использовать для реализации чата. Я подумал об использовании синхронизации приложения, и моя единственная проблема до сих пор заключается в том, чтобы, если я могу видеть, какие пользователи не находятся в сети на момент отправки сообщения, я могу отправить push-уведомление.

Или, если приложение синхронизирует это прямо из коробки и также отправляет уведомление?

Спасибо за любую помощь

1 Ответ

0 голосов
/ 28 августа 2018

Эй, это отличный вопрос. Короткий ответ: AppSync SDK не обрабатывает отслеживание присутствия «из коробки», но вы можете реализовать эту функцию самостоятельно без особых хлопот.

Вдобавок ко всему, один из способов сделать это - создать таблицу DynamoDB «ActiveUsers». Включите DynamoDB TTL (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html) для таблицы (используя некоторый атрибут «timestamp») и используйте некоторый уникальный пользовательский атрибут, такой как username или userId, в качестве ключа раздела таблицы.

Затем из AppSync создайте мутацию Mutation.ping , которая делает вызов PutItem следующим образом:

{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username)
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson({
      timestamp: $util.time.nowEpochSeconds() + 300 # some amount of time
    })
}

С вашего клиента вы будете вызывать эту мутацию каждые N секунд, во время запуска или на основании некоторых других критериев. В случае, когда у пользователя хорошее соединение, пусть приложение вызывает другую мутацию Mutation.goOffline , которая удаляет запись из DynamoDB всякий раз, когда приложение закрывается. Если у пользователя нет хорошего соединения, и, следовательно, клиент не может отправить мутацию Mutation.goOffline , TTL DynamoDB может привести нас в порядок.

Для отправки обновлений, если кто-то подключен к сети или офлайн, подключенным клиентам вы можете сделать подписку Subscription.onActiveChange с помощью этой директивы @ aws_subscribe (мутации: ["publishActiveChange"]) . Затем также определите мутацию Mutation.publishActiveChange и попросите ее вернуть идентификатор пользователя и статус активности пользователя. Чтобы закончить рисунок, вы должны создать поток DynamoDB, который вызывает лямбда-функцию, которая вызывает мутацию Mutation.publishActiveChange , при которой объект либо удаляется, либо (вновь) создается в DynamoDB, публикует сообщение.

В качестве альтернативы вы можете подписаться на мутации ping и goOffline и не беспокоиться о потоке DynamoDB и функции лямбды, но этот подход не будет публиковать подписку, когда клиентское устройство переходит в автономный режим перед звонком goOffline . TTL все еще будет работать, но устройство должно будет получать уведомление с помощью последующего запроса. В зависимости от ваших требований, это работает довольно хорошо и имеет преимущество в том, что является менее сложным.

Еще одна вещь, которую следует учитывать, - это то, что TTL DynamoDB не гарантированно произойдет немедленно, но на практике работает довольно хорошо (в течение нескольких минут). Но действительно большие таблицы, скорее всего, будут немного задерживаться.

...