Уведомления 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
Эта проблема нуждается во внутренней реализации.
Позвольте мне обсудить, как я преодолею этот недостаток.
Мы знаем о жизненном цикле деятельности. Поэтому после уничтожения я вызываю службу из внешнего сервера, которая отбрасывает мой токен клиента.
Все входящие сообщения теперь будут поставлены в очередь для доставки, так как токен для целевого клиента незарегистрирован.
Поэтому, возвращая приложение, я вызываю вспомогательную службу, которая регистрирует моего клиента.
Задний конец теперь начинает отправлять сообщения из очереди с новым токеном клиента для моего устройства.