Приложение, подключенное к FCM, не получает уведомление от AWS SNS

Я подключил приложение Android к службе Google Firebase Cloud Messaging (FCM), следуя этому руководству.,

и я выполнил этот ответ, чтобы установить соединение между FCM и AWS SNS.

Мне удалось получить сообщение, отправленное с консоли FCM, но не с Консоль AWS SNS.

Сообщение статус доставки, зарегистрированное на AWS, показало УСПЕШНО. для каждого сообщения, которое я отправил, пока на моем устройстве не отображалось уведомление.

Есть ли способ проверить, что происходит?


person bluenowhere    schedule 02.12.2016    source источник
comment
То же самое. И негде узнать, как и когда сбрасывает сообщение. Отчеты Cloudwatch показывают успешность всех отправленных мной сообщений, но ни одно из них не доставляется на устройство. Есть ли кто-нибудь, у кого есть ответ на этот вопрос? Я подозреваю, что здесь Firebase.   -  person Joseph Bolade Caxton-Idowu    schedule 01.08.2017
comment
Вы решили свою проблему? Bcoz Я тоже столкнулся с той же проблемой.   -  person Gaurav Pandey    schedule 22.09.2018


Ответы (5)


Проблема здесь в том, что AWS SNS отправляет то, что Google называет сообщениями с данными.

С помощью FCM вы можете отправлять два типа сообщений - уведомления и данные. Уведомления отображаются FCM автоматически, а сообщения с данными - нет. Подробнее об этом здесь: https://firebase.google.com/docs/cloud-messaging/concept-options

Сообщения с данными, поступающие из SNS, по-прежнему можно обрабатывать - даже если ваше приложение работает в фоновом режиме - путем расширения FirebaseMessagingService и переопределения его onMessageReceived метода. Подробнее об этом здесь: https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService.

Я предполагаю, что вы хотите, чтобы ваши сообщения AWS SNS имитировали работу с уведомлениями, а именно:

  • Смотрите, как они всплывают, когда приложение работает в фоновом режиме
  • Отображать текст в уведомлении
  • Когда приложение активируется, вы хотите, чтобы все сообщения были удалены из ящика.

Для этого вам нужно сделать три вещи.

Во-первых - вы захотите начать отслеживание, отображается ли ваше приложение в данный момент или нет. Подробную информацию о том, как надежно обнаружить это, вы можете найти здесь: https://stackoverflow.com/a/18469643/96911

Во-вторых - вы захотите обрабатывать сообщения с данными от AWS SNS, разместив уведомление, но только когда ваше приложение работает в фоновом режиме:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    static protected int id = 0;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        if (!MyApplication.isActivityVisible()) {
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
            mBuilder.setContentTitle(getString(R.string.app_name))
                    .setSmallIcon(R.drawable.notification_icon);

            String message = remoteMessage.getData().get("default");
            mBuilder.setContentText(message);

            Intent resultIntent = new Intent(this, MainActivity.class);
            PendingIntent resultPendingIntent =
                    PendingIntent.getActivity(
                            this,
                            0,
                            resultIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT
                    );
            mBuilder.setContentIntent(resultPendingIntent);

            NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

            mNotificationManager.notify(id ++, mBuilder.build());
        }
    }

}

И наконец - вы захотите удалить все уведомления из ящика, когда пользователь нажимает на одно из них. В сочетании с отслеживанием видимости, которое я связал чуть выше, активность, отвечающая на уведомления, должна иметь следующий onResume метод:

@Override
protected void onResume() {
    super.onResume();

    MyApplication.activityResumed();

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    mNotificationManager.cancelAll();
}

Вы давно не задавали этот вопрос, но мне было так больно разбираться в этом, что я все равно решил ответить. Я надеюсь, что это поможет вам или кому-то, кто рвет на себе волосы, пытаясь заставить эту штуку работать (потому что заставить работать iOS было проще простого, черт возьми).

person Ivan Karpan    schedule 06.09.2017
comment
Это мне помогло. - person Saurabh Ghewari; 04.11.2018
comment
У меня это не сработало. Проблема в том, что ручная доставка сообщений Firebase работает, но не работает из AWS SNS. - person Yuki Tanaka; 12.04.2020

Вы можете использовать это видео-руководство https://youtu.be/iBTFLu30dSg с английскими субтитрами о том, как использовать FCM с AWS. Пошаговая инструкция по SNS и пример отправки push-уведомлений из консоли AWS. У меня это работает хорошо, и я успешно получил push-уведомление из консоли SNS и из моего кода на мобильном устройстве.

person Arbron    schedule 13.02.2018

Я столкнулся с той же проблемой, сообщение от Firebase с токеном устройства работает, но каким-то образом сообщение из SNS в Firebase не доставляется.

Я также разработал приложение для iOS, и в тот момент я просто отправлял доставленное сообщение «brabra» в iOS. Однако FCM принимает сообщения определенного формата только для его тестирования с консоли AWS SNS.

Вот пример формата успешной доставки сообщения на Android через SNS и FCM.

{
 "GCM": "{\"notification\": { \"body\": \"Sample message for Android endpoints\", \"title\":\"Hello world\" } }"
}

Дело в том, что мы должны изменить «уведомление», а не «данные», и в уведомлении должны быть указаны тело и заголовок.

person Yuki Tanaka    schedule 12.04.2020
comment
Привет, я не могу отправить уведомление IOS, есть ли какой-то конкретный формат, который мне нужно использовать для полезной нагрузки, чтобы отправить ее через SNS. Он работает из Firebase, но не из SNS. - person Curiousdev; 27.07.2020
comment
Я изо всех сил пытался заставить сообщения iOS работать от SNS - ›FCM, и этот комментарий был мне палочкой-выручалочкой. Спасибо! - person brk; 09.10.2020

Просто используя этот формат JSON:

{
  "GCM": "{ \"notification\": { \"body\": \"Sample message for Android endpoints\",\"title\": \"Sample message for Android endpoints\"}}"
}
person Hariom Maurya    schedule 13.11.2020

Чтобы получить данные из консоли AWS SNS, выполните следующие действия:

1) Добавьте проект в FCM и используйте устаревший серверный ключ для AWS SNS.

2) Получите токен устройства, используя приведенный ниже код:

String deviceToken = FirebaseInstanceId.getInstance().getToken();

3) Внедрите приведенный ниже код в свое приложение.

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

@Override
public void onTokenRefresh() {

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {
    // TODO: Implement this method to send token to your app server.
}

}

4) Переопределите onMessageReceived () его вызов при получении уведомления:

public class AppFirebaseMessagingService extends FirebaseMessagingService {
static protected int id = 0;

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //remoteMessage.getNotification().getBody()


     if (remoteMessage.getData().get("default").length() > 0) {
              Intent intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
        Uri ringNotificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notifyBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("ApplicationName")
                .setContentText(remoteMessage.getData().get("default"))
                .setAutoCancel(true)
                .setSound(ringNotificationSound)
                .setContentIntent(pendingIntent);
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(id++, notifyBuilder.build());

    }
}

}

Когда мы получаем уведомление от AWS SNS Service, мы используем remoteMessage.getData().get("default") для чтения сообщения от AWS.

person Sumant Singh    schedule 20.09.2017