FCM с AWS SNS

Я использую AWS ресурсы для моего проекта Android, я планирую добавить службу push-уведомлений для моего проекта с AWS SNSЕсть несколько вопросов, которые беспокоят меня. Я не нашел никаких вопросов по этому поводу, кроме одного или двух, но с неясными объяснениями.

1.Does AWS служба поддержки FCM? SNS работать с GCM, Но Google рекомендует использовать FCM вместо GCM, я не нашел AWS поддержки FCM,

2.Do AWS хранить сообщения (или данные) в своих базах данных даже после отправки push-уведомлений?

3. Я попытался вставить ключ API FCM в платформу приложения SNS, он показывает неверные параметры, почему?

6 ответов

Решение

FCM обратно совместим с GCM. Шаги для настройки FCM на AWS идентичны процедуре настройки GCM, и (по крайней мере, на данный момент) FCM прозрачно работает с GCM и SNS в отношении конфигурации на стороне сервера.

Тем не менее, если вы отправляете data полезные нагрузки на устройство Android, они не будут обрабатываться, если вы не реализуете клиентскую службу, которая расширяет FirebaseMessagingService, Генератор сообщений JSON по умолчанию в консоли AWS отправляет data сообщения, которые будут игнорироваться вашим приложением, если вышеупомянутая служба не будет реализована. Чтобы обойти это для первоначального тестирования, вы можете предоставить notification полезная нагрузка, которая будет получена вашим устройством (если ваше приложение не на переднем плане)

Существуют инструкции по миграции GCM-FCM, предоставленные Google, однако изменения, которые необходимо внести, в основном относятся к приложению.

Шаги, которые необходимо выполнить для тестирования GCM/FCM в приложении с SNS:

  1. Создайте приложение платформы в SNS, выбрав Google Cloud Messaging (GCM) в качестве платформы push-уведомлений и предоставив свой ключ API сервера в поле ключа API.
  2. Выберите приложение платформы и нажмите кнопку " Создать конечную точку платформы".
  3. Укажите InstanceID (токен устройства), сгенерированный вашим приложением. Вы должны продлить FirebaseInstanceIDService и переопределить onTokenRefresh способ увидеть это в вашем приложении для Android. После этого удалите и переустановите приложение, и ваш токен должен быть напечатан на консоли Debug в Android Studio при первой загрузке.
  4. Нажмите кнопку Добавить конечную точку.
  5. Нажмите на ссылку ARN для вашего приложения платформы.
  6. Выберите только что созданную конечную точку для вашего устройства и нажмите кнопку " Опубликовать в конечную точку".
  7. Выберите формат сообщения JSON и нажмите кнопку генератора сообщений JSON.
  8. Введите тестовое сообщение и нажмите кнопку " Создать JSON"
  9. Теперь наступает "часть гоча".

Сообщение, которое генерируется SNS, будет иметь форму:

{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}

Как мы упоминали ранее, data полезные нагрузки будут игнорироваться, если не реализована служба для их получения. Мы хотели бы протестировать без написания большого количества кода, поэтому вместо этого мы должны отправить notification полезная нагрузка. Для этого просто измените сообщение JSON следующим образом:

{
"GCM": "{ \"notification\": { \"text\": \"test message\" } }"
}

Сделав это, убедитесь, что ваше приложение не запущено на устройстве, и нажмите кнопку " Опубликовать сообщение". Теперь вы должны увидеть всплывающее уведомление на вашем устройстве.

Конечно, вы можете делать все это программно через API Amazon SNS, однако все примеры, похоже, используют data полезная нагрузка, поэтому вам нужно помнить об этом и генерировать полезную нагрузку, соответствующую вашему варианту использования.

Теперь вы можете перейти в консоль Firebase ( https://console.firebase.google.com/), выбрать свой проект, щелкнуть значок шестеренки и выбрать настройки проекта, а затем перейти на вкладку облачных сообщений...

Вы увидите устаревший ключ сервера, который является ключом API GCM, и у вас будет возможность сгенерировать новые ключи сервера, которые являются версиями FCM

SNS примет обе версии, но их пункт меню по-прежнему относится к категории GCM

Вот изображение для вашей справки:

введите описание изображения здесь

Обратите внимание, что вы можете "случайно" удалить ключи сервера, но устаревший ключ сервера удалить нельзя. Кроме того, если вы нажмете кнопку добавления ключа сервера, вы получите новый ключ сервера ниже первого, БЕЗ ПРЕДУПРЕЖДЕНИЯ! ... Отличная работа Google;)

Еще одна дополнительная заметка к великому ответу Натана Данна. Как отправить данные с уведомлением из SNS в Firebase.

Нам нужно добавить данные в Json (внутри уведомления):

{
    "default": “any value", 
     "GCM": "{ \"notification\": { \"body\": \”message body\”, \”title\”: \”message title \”, \"sound\":\"default\" } , \"data\" : {\”key\" : \”value\", \”key2\" : \”value\” } }”
}

В вашей реализации FirebaseMessagingService (пример Xamarin)

public override void OnMessageReceived(RemoteMessage message)
{

    try
    {

        var body = message?.GetNotification()?.Body;
        var title = message?.GetNotification()?.Title;
        var tag = message?.GetNotification()?.Tag;
        var sound = message?.GetNotification()?.Sound;

        var data = message?.Data
        foreach (string key in data.Keys)
        {
            // get your data values here
        }

    }
    catch (Exception e)
    {
    }
}

Я пытался использовать решение с полезными данными уведомлений вместо данных, но я не получал push-уведомлений на мобильном устройстве. Я нашел этот учебник https://youtu.be/iBTFLu30dSg с английскими субтитрами о том, как шаг за шагом использовать FCM с AWS SNS, и пример того, как отправлять push-уведомления из консоли AWS и реализовывать его на php с помощью aws php sdk. Это мне очень помогло.

Просто дополнительная заметка к ответу Натана Данна: для добавления звука используйте следующее сообщение JSON

{
"GCM": "{ \"notification\": { \"text\": \"test message\",\"sound\":\"default\" } }"
}

Amazon поддерживает FCM, так как весь предыдущий код был перенесен из GCM в FCM. Ниже статья подробно объясняет.

Статья опубликована Amazon

Мне потребовалось некоторое время, чтобы выяснить, как отправить уведомление с правильной полезной нагрузкой (публикация в теме). Так что я поставлю это здесь.

private void PublishToTopic(string topicArn)
{
    AmazonSimpleNotificationServiceClient snsClient = 
           new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.EUWest1);
    PublishRequest publishRequest = new PublishRequest();
    publishRequest.TopicArn = topicArn;
    publishRequest.MessageStructure = "json";
    string payload = "\\\"data\\\":{\\\"text\\\":\\\"Test \\\"}";
    publishRequest.Message = "{\"default\": \"default\",\"GCM\":\"{" + payload + "}\"}";
    PublishResponse publishResult = snsClient.Publish(publishRequest);
}    

Чтобы ответить на вопросы:

  1. AWS SNS поддерживает FCM.
  2. Ни один AWS не хранит сообщения после отправки push-уведомлений.

Для подробного руководства по настройке FCM с просьбами SNS прочитайте эту статью.