Уведомления не всегда принимаются по телефону?

Уведомления не всегда принимаются на моих телефонах Android, хотя Cloud Functions всегда отправляет их. В качестве полезного бокового узла: сообщения WhatsApp всегда принимаются (я его тестировал).

Я заметил, что уведомления принимаются немедленно, когда телефон заряжается или когда вы открываете приложение.

Кроме того, UID пользователя не всегда отправляется в базу данных, даже несмотря на то, что уведомление было отображено (вы поймете, что я имею в виду, прочитав код).

Мой вопрос: что я могу изменить для получения уведомлений, а затем все время нажимать на базу данных, как это должно быть?

Мои уведомления относятся к типу «хэдз-ап».

Я пытался оптимизировать свой код в течение нескольких дней без успеха. Мне нужна помощь.

Структура кода:

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

    public class MyFirebaseMessagingService extends FirebaseMessagingService { // Firebase instance variables private FirebaseAuth mFirebaseAuth; private FirebaseUser mFirebaseUser; DatabaseReference myURL = FirebaseDatabase.getInstance().getReferenceFromUrl("https://newproj-54a87.firebaseio.com/notified"); @Override public void onMessageReceived(RemoteMessage remoteMessage) { // Check if message contains a data payload. if (remoteMessage.getData() != null) { mFirebaseAuth = FirebaseAuth.getInstance(); mFirebaseUser = mFirebaseAuth.getCurrentUser(); if(mFirebaseUser != null) mUID = mFirebaseUser.getUid(); myURL.push().setValue(mUID); sendNotification(remoteMessage.getData().get("body"), remoteMessage.getData().get("title"), remoteMessage.getData().get("icon")); } } private void sendNotification(String messageBody, String messageTitle, String iconURL) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Bitmap bitmap = getBitmapFromURL(iconURL); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setDefaults(DEFAULT_SOUND | DEFAULT_VIBRATE) .setPriority(Notification.PRIORITY_MAX) .setStyle(new NotificationCompat.BigTextStyle()) .setSmallIcon(R.drawable.myIcon) .setLargeIcon(bitmap) .setContentTitle(messageTitle) .setContentText(messageBody) .setAutoCancel(true) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } public Bitmap getBitmapFromURL(String strURL) { //from https://stackoverflow.com/a/16007659 try { URL url = new URL(strURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); Bitmap myBitmap = BitmapFactory.decodeStream(input); return myBitmap; } catch (IOException e) { e.printStackTrace(); return null; } } } 

Моя облачная функция:

  const payLoad = { data:{ title: name, body: body, icon: photoURL } }; var options = { priority: "high", timeToLive: 1000 }; return admin.messaging().sendToTopic("notify", payLoad, options); 

Скажите, пожалуйста, если я забыл часть информации. Я работаю на ограниченном графике!

Если вы используете Android 6.0 или версии выше, есть функция Doze, которая оптимизирует использование батареи. Когда ваш телефон находится в режиме ожидания (и он не заряжается), он получает только уведомления FCM с высоким приоритетом и, вероятно, это ваш случай.

Документация для Android :

FCM оптимизирован для работы с режимами ожидания Doze и App Standby с помощью высокоприоритетных сообщений FCM. Высокоприоритетные сообщения FCM позволяют надежно разбудить ваше приложение для доступа к сети, даже если устройство пользователя находится в режиме «Доза» или приложение находится в режиме ожидания приложения. В режиме Doze или App Standby система отправляет сообщение и предоставляет приложению временный доступ к сетевым службам и частичным wakelocks, а затем возвращает устройство или приложение в состояние ожидания.

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