Firebase на Android - я хочу отключить уведомления firebase на клиенте Android
Я использую консоль Firebase для отправки уведомлений пользователям. Однако я хочу, чтобы пользователи отключали уведомления. Как я могу их отключить?
Я могу обрабатывать (и останавливать) уведомления через FirebaseMessagingService только тогда, когда приложение находится на переднем плане. Но я не могу остановить уведомления, когда приложение находится в фоновом режиме.
5 ответов
Не уверен, почему это происходит с вами (возможно, фрагмент кода?), но есть тяжеловесное окончательное решение: определите свой собственный приемник c2dm в манифесте и установите высокий приоритет (>0), затем остановите обработку уведомления.
сообщения GCM обрабатываются как упорядоченные трансляции, поэтому вы можете остановить цепочку обработки, вызвав это метод:
https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()
Если вы ничего не делаете в своем приемнике, то следующий приемник будет выполнять обработку, которая будет приемником Firebase.
обратите внимание: хотя это безопасно сделать, вероятно, вы предполагаете, что ничто другое не отправляется как push-уведомление Firebase. Это может быть правдой сейчас (хотя я не совсем уверен), но в будущем все может измениться. Итак, просто имейте это в виду и тщательно протестируйте решение.
Я не могу комментировать, но комментарий racs мне очень помогли.
фактически, документы Firebase рекомендуют использовать Data push вместо уведомления, если вы хотите иметь полный контроль над тем, как это обработано: firebase.google.com/docs/cloud-messaging / ... - цитата: "использовать уведомления, когда вы хотите, чтобы FCM обрабатывал отображение уведомления на имя вашего клиентского приложения. Использование сообщений данных, когда вы хотите, чтобы ваше приложение отображения или обработки сообщения на вашем Android-клиент приложение..."
таким образом, в основном, я изменил тело для запроса push-уведомления от:
{
"data": {
"type" : "mytype"
},
"notification": {
"title": "My Title",
"body": "My Notification Message"
},
"to": "/topics/all"
}
в:
{
"data": {
"type" : "mytype",
"title": "My Title",
"body": "My Notification Message"
},
"to": "/topics/all"
}
теперь мое приложение вызывает onMessageReceived () каждый раз даже в фоновом режиме, и я просто изменил методы, чтобы использовать полученный заголовок уведомления и сообщение в push-данных.
у меня была эта проблема.и решается с помощью кода ниже:
Включить Уведомления Firebase:
FirebaseInstanceId.getInstance().getToken();
Отключить Уведомления Firebase: deleteInstanceId () - блокирующий вызов. Его нельзя вызвать в основном потоке.
FirebaseInstanceId.getInstance().deleteInstanceId();
вы можете обрабатывать все события 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, вы должны быть add 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>
я встречаю тот же вопрос. Я использую subscribeToTopic API для подписки на уведомления.
FirebaseMessaging.getInstance().subscribeToTopic("APP");
и я нахожу другой API unsubscribeFromTopic чтобы отписаться.
FirebaseMessaging.getInstance().unsubscribeFromTopic("APP");
возможно, это было бы полезно для приложения с помощью уведомления темы. Он не будет получать уведомления на переднем и заднем плане.