FCM - не может получать уведомления, отправленные с того же устройства после входа в систему как другой пользователь - PullRequest
0 голосов
/ 26 апреля 2018

Я отправляю уведомления с моего сервера Flask, используя PyFCM , и тестирую его на одном устройстве Android. Тест выглядит следующим образом: я вошел в систему как пользователь A, и я комментирую сообщение пользователя B, в котором после входа B должно отображаться push-уведомление. Вот как я отправляю уведомление с моего сервера:

registration_id="<device_registration_id>"
message_body = "A has commented on your post."
data_message = {"sender": current_user.id}
result =  push_service.notify_single_device(
    registration_id=registration_id,
    message_body=message_body,
    data_message=data_message
)

И вот как я получаю сообщение в службе обмена сообщениями Firebase на Android:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent resultIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT):

    String senderId = remoteMessage.getData().get("sender");
    if (senderId != currentUser.id) {
        NotificationCompat.Builder mNotificationBuilder = new NotificationCompat.Builder(this, "default_channel")
            .setSmallIcon(R.drawable.android_icon)
            .setContentTitle("New Comment")
            .setContentText(remoteMessage.getNotification().getBody())
            .setAutoCancel(true)
            .setSound(soundURI)
            .setContentIntent(resultIntent);

        NoticationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, mNotificationBuilder.build());
    }  
}

Как видите, у меня есть условие: senderId != currentUser.id перед тем, как составить уведомление. Это потому, что я использую одно устройство для отправки и получения уведомления, поэтому есть только один registation_id / token для пользователей A и B. Если я уберу это условие, пользователь A получит уведомление сразу после комментирования сообщения B. Я хочу убедиться, что B является тем, кто получает уведомление. Однако после выхода из системы A и входа в систему B я не смог увидеть push-уведомление.

1 Ответ

0 голосов
/ 27 апреля 2018

Я думаю, что onMessageReceived запускается только один раз. Скажем, я пытаюсь отправить уведомление со своего сервера всем пользователям и получаю его, когда вошел в систему как А. Я очищаю панель уведомлений, выхожу из системы и захожу как B, но я не вижу другого экземпляра. уведомления.

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

  1. Пользователь A входит в систему, поэтому deviceToken = A.
  2. Вы отправляете сообщение со своего сервера на deviceToken.
  3. deviceToken получает сообщение, , но вы его не отображаете.
  4. Пользователь A выходит из системы, пользователь B входит в систему, теперь deviceToken = B. Примечание: тот же deviceToken, просто другой пользователь.

На шаге 4 вы все еще ожидаете прибытия сообщения, но технически это уже произошло, когда пользователь А все еще входил в систему. onMessageReceived не будет запускаться снова, поскольку он уже получил сообщение, как и ожидалось.

Чтобы проверить желаемое поведение, вам понадобятся два устройства. Я также фактически делаю это с приложением, которое я сделал (проверяя senderId с идентификатором currentUser), поэтому я думаю, что оно должно работать и для вас.

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

...