Firebase на Android — я хочу отключить уведомления Firebase на клиенте Android

Я использую консоль Firebase для отправки уведомлений пользователям. Однако я хочу, чтобы пользователи отключали уведомления. Как я могу отключить их?

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


person martinodecarlo    schedule 29.05.2016    source источник


Ответы (5)


Не уверен, почему это происходит с вами (может быть, фрагмент кода?), но есть серьезное окончательное решение: определите свой собственный получатель c2dm в манифесте и установите высокий приоритет (> 0), а затем остановите обработку уведомления.

Сообщения GCM обрабатываются как упорядоченные широковещательные рассылки, поэтому вы можете остановить цепочку обработки, вызвав этот метод:

https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()

Если вы ничего не сделаете в своем приемнике, то следующий приемник выполнит обработку, которая будет приемником Firebase.

Обратите внимание: Firebase отправляет push-уведомления об изменениях Remote Config. Таким образом, если вы используете Remote Config, не рекомендуется подавлять отправку данных.

person racs    schedule 29.05.2016
comment
На самом деле, документы Firebase рекомендуют использовать push-уведомления вместо уведомлений, если вы хотите иметь полный контроль над тем, как они обрабатываются: firebase.google.com/docs/cloud-messaging/ - цитата: используйте уведомления, если вы хотите, чтобы FCM обрабатывал отображение уведомлений от имени вашего клиентского приложения. Используйте сообщения с данными, если вы хотите, чтобы ваше приложение обрабатывало отображение или обрабатывало сообщения в клиентском приложении для Android... - person racs; 30.05.2016
comment
Спасибо. Используя push данных (через запрос POST), я могу обработать уведомление, даже если приложение находится в фоновом режиме. Теперь, как я могу отправлять данные на все устройства, не указывая токен каждого отдельного устройства в моем файле JSON? Через консоль Firebase можно указать пользовательский сегмент, но если я не укажу элемент в файле JSON, я получаю ошибку 400. - person martinodecarlo; 04.06.2016
comment
Я не эксперт в этой теме, но, насколько я могу судить, когда вы выполняете push-уведомление, вы в основном пропускаете функции Firebase. Так что ни рассылка подписчикам темы, ни аналитика не доступны. В этом случае FB действует как ретранслятор для GCM и вообще не взаимодействует с отправляемыми данными. - person racs; 07.06.2016
comment
Как кажется, доступна отправка данных в темы: firebase.google.com/ docs/cloud-messaging/ Вы можете зарегистрировать каждое устройство в теме и отправить данные в эту тему, поэтому вам не нужно самостоятельно отслеживать токены устройств. - person racs; 07.06.2016

Я еще не мог комментировать, но комментарий racs мне очень помог.

На самом деле, документы Firebase рекомендуют использовать push-уведомления вместо уведомлений, если вы хотите иметь полный контроль над тем, как они обрабатываются: firebase.google.com/docs/cloud-messaging/… - цитата: «Используйте уведомления, когда вы хотите, чтобы FCM обрабатывал отображение уведомления от имени вашего клиентского приложения. Используйте сообщения с данными, если вы хотите, чтобы ваше приложение обрабатывало отображение или обработку сообщений в клиентском приложении для Android..."

Итак, в основном, я изменил тело для запроса push-уведомления с:

{
   "data": {
       "type" : "mytype"
    },
    "notification": {
        "title": "My Title",
        "body": "My Notification Message"
    },
    "to": "/topics/all"
}

To:

{
   "data": {
       "type" : "mytype",
       "title": "My Title",
       "body": "My Notification Message"
    },
    "to": "/topics/all"
}

Теперь мое приложение вызывает onMessageReceived() каждый раз, даже в фоновом режиме, и я просто изменил методы, чтобы использовать полученный заголовок уведомления и сообщение в push-данных.

person Alvin Rusli    schedule 19.09.2016
comment
Будет ли способ использовать этот метод и чтобы push-уведомления считались уведомлением, а не только данными на панели управления firebase? - person Benoit; 04.04.2019
comment
@Benoit Использование консоли fcm всегда отправляет объект уведомления - person Alvin Rusli; 05.04.2019
comment
@AlvinRusli действительно полезный ответ, как я могу обрабатывать полученные данные, когда приложение убито/закрыто? - person Mehdi Dehghani; 12.06.2019
comment
Спасибо, вот документы firebase.google.com/docs/cloud-messaging/concept. -опции - person FindOutIslamNow; 14.04.2020

Я встречаю тот же вопрос. Я использую subscribeToTopic API для подписки на уведомления.

FirebaseMessaging.getInstance().subscribeToTopic("APP");

И я нахожу другой API unsubscribeFromTopic, чтобы отказаться от подписки.

FirebaseMessaging.getInstance().unsubscribeFromTopic("APP");

Возможно, это было бы полезно для приложения, использующего уведомление темы. Он не будет получать уведомления на переднем и заднем плане.

person Fantasy Fang    schedule 03.09.2016

У меня была эта проблема. И она была решена с помощью кода ниже:

Включить уведомления Firebase:

FirebaseInstanceId.getInstance().getToken();

Отключить уведомления Firebase: deleteInstanceId() — это блокирующий вызов. Его нельзя вызывать в основном потоке.

FirebaseInstanceId.getInstance().deleteInstanceId();
person Better    schedule 06.07.2017
comment
где установлен метод FirebaseInstanceId.getInstance().deleteInstanceId(); ? - person ARR.s; 06.07.2017
comment
Я использую AsyncTask и помещаю FirebaseInstanceId.getInstance().deleteInstanceId(); в doInBackground - person Better; 25.08.2017

Вы можете обрабатывать все push-события из всех разностных служб (с помощью Firebase). Сначала создайте YouUniversalFCM extends WakefulBroadcastReceiver

Например:

public class YourUniversalFCM extends WakefulBroadcastReceiver {

    private static final String ACTION_REGISTRATION
        = "com.google.android.c2dm.intent.REGISTRATION";
    private static final String ACTION_RECEIVE
        = "com.google.android.c2dm.intent.RECEIVE";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        for (String key : intent.getExtras().keySet()) {
            Log.d(
                    "TAG",
                    "{UniversalFCM}->onReceive: key->"
                            + key + ", value->" + intent.getExtras().get(key)
            );
        }
        switch (action) {
            case ACTION_REGISTRATION:
                // TODO: 2016-08-06
                break;

            case ACTION_RECEIVE:
                // TODO: 2016-08-06
                break;

            default:
        }

        abortBroadcast();
    }
}

Далее в AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

<application
    ...>

    ...

    <receiver
        android:name=".fcm.receivers.UniversalFCM"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
            <category android:name="YOUR_PACKAGE"/>
        </intent-filter>
    </receiver>

</application>

Замените YOUR_PACKAGE на пакет вашего приложения. Это все. Если вы хотите подписаться на другую услугу push-уведомлений, вам необходимо добавить YourTokenService

public class YourTokenService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        L.d(TokenService.class, "onTokenRefresh() Refreshed token: " + refreshedToken);
        // TODO: 2016-08-06
        super.onTokenRefresh();
    }
}

И объявлено в AndroidManifest.xml

<service android:name="YourTokenService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>
person TarikW    schedule 06.08.2016
comment
WakefulBroadcastReceiver устарел. Пожалуйста, избегайте этого метода и обратитесь к ответу Элвина Русли. - person Alex Timonin; 20.02.2018