Уведомления Firebase (FCM) не появляются, когда приложение Android отключено из последнего лотка

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

$url = 'https://fcm.googleapis.com/fcm/send';
        $fields = array(
             'registration_ids' => $tokens,
             'data' => $message
            );
        $headers = array(
            'Authorization:key = SERVER_KEY ',
            'Content-Type: application/json'
            );

1.Новости появляются, когда приложение находится на переднем плане и в фоновом режиме без каких-либо проблем. Но если я удалил приложение из последнего лотка, тогда уведомления не появятся, мне, должно быть, придется обработать это решение для этого? (например, уведомления Whatsup показывают все сценарии, даже если я отключил это приложение от настроек)

2. Когда я получил уведомление от "onMessageReceived", как передать это сообщение, содержимое тела для моей активности/фрагментов?

3. В некоторых случаях я хочу отправлять уведомления всем, вместо того, чтобы добавлять все маркеры в массив. любой другой способ обработки, как "отправить ALL", что-то вроде этого?

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MsgService";
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.d(TAG, "From: " + remoteMessage.getFrom());
        Log.d(TAG, "Data Payload : " + remoteMessage.getData());
        sendNotification(remoteMessage.getData().get("message"));
    }
    private void sendNotification(String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);
        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase Push Notification")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notificationBuilder.build());
    }
} 

Неудачные устройства: (Уведомления удалены не приходят после удаления из последнего лотка)

  • MI Redmi Примечание 2 (5.0.2 Lollipop)
  • Huawei honor 5c (5.1.1 Lollipop)

Превосходные устройства: (Уведомления удаляются из последнего лотка)

  • HTC One X (4.2 желе Bean)
  • Samsung Galaxy Grand Prime (4.4 Kitkat)

Ответ 1

1.Новости появляются, когда приложение находится на переднем плане и в фоновом режиме без каких-либо проблем. Но если я удалил приложение из последнего лотка, уведомления не поступают, я должен обработать это решение для это? (например, уведомления Whatsup показывают все сценарии, даже я сила остановила это приложение из настроек)

В соответствии с вашим кодом вы должны получать исключение нулевого указателя на remoteMessage.getNotification().getBody(), поскольку вы не отправляете уведомление, вместо этого вы отправляете полезную нагрузку от вашего запроса на завивание. Согласно моему личному опыту, проблема, о которой вы только что упомянули, особенно заметна в Android Kitkat или ниже устройств. На Lollipop или выше. Нажатие Firebase, похоже, работает нормально.

2. Когда я получил уведомление от "onMessageReceived", как передать это сообщение, содержимое тела для моей активности/фрагментов?

Вы можете опубликовать трансляцию с onMessageReceived() и зарегистрировать приемник Braodcast в своей деятельности и отправить данные в своем намерении трансляции. Пример кода:

Деятельность

private BroadcastReceiver receiver;

@Overrride
public void onCreate(Bundle savedInstanceState){

  // your oncreate code

  IntentFilter filter = new IntentFilter();
  filter.addAction("SOME_ACTION");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      String message = intent.getStringExtra("message");
    }
  };
     registerReceiver(receiver, filter);
}

 @Override
 protected void onDestroy() {
  if (receiver != null) {
   unregisterReceiver(receiver);
   receiver = null
  }
  super.onDestroy();
 }

FirebaseMessagingService

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MsgService";
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.d(TAG, "From: " + remoteMessage.getFrom());
        Log.d(TAG, "Notification Message Body: " + remoteMessage.getData());

        Intent intent=new Intent();
        intent.setAction("SOME_ACTION");
        intent.putExtra("message", remoteMessage.getNotification().getBody());
        sendBroadcast(intent);
    }
} 

3. В некоторых случаях я хочу отправлять уведомления всем, вместо того, чтобы добавлять все маркеры в массив. любой другой способ обработки, как "отправить на ВСЕ", что-то в этом роде?

В Firebase API нет ничего похожего на "Отправить ALL", единственный способ сделать это - использовать Firebase Console, у которого есть свои проблемы для обработки как проблема с белым значком и копирование пользовательских параметров вашего уведомления.

Ответ 2

У меня была проблема с FCM точно на телефоне Mi Phone и Huawei! Оказывается, что это не проблема с FCM или вашим приложением, а на уровне их устройств.

У них есть настройки приложения на уровне устройства, которые отключают уведомления или даже блокируют блокировку, поэтому onMessageReceived() не запускается, когда приходит сообщение. После того, как я изменил настройки (в основном, разрешить уведомления и отключить оптимизацию батареи для моего приложения), все работает отлично!

Обратитесь к облачным сообщениям Firebase, не полученным приложением в фоновом режиме.

Ответ 3

Эта проблема нуждается во внутренней реализации. Позвольте мне обсудить, как я преодолею этот недостаток.

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

Поэтому, возвращая приложение, я вызываю вспомогательную службу, которая регистрирует моего клиента. Задний конец теперь начинает отправлять сообщения из очереди с новым токеном клиента для моего устройства.