[英]Firebase on Android - I want to disable firebase notifications on Android client
我正在使用Firebase控制台向用戶發送通知。 但是,我想讓用戶禁用通知。 我怎樣才能禁用它們?
只有當應用程序位於前台時,我才能通過FirebaseMessagingService處理(和停止)通知。 但是,當應用程序處於后台時,我無法停止通知。
我還沒評論,但是racs的評論給了我很多幫助。
實際上,如果您希望完全控制處理方式,Firebase文檔建議使用數據推送而不是通知:firebase.google.com/docs/cloud-messaging / ... - quote:“當您希望FCM處理時使用通知代表您的客戶端應用程序顯示通知。當您希望應用程序處理顯示或處理Android客戶端應用程序上的消息時,請使用數據消息......“
所以基本上,我改變了推送通知請求的主體:
{
"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(),我只是改變了方法,以便在推送數據中使用獲得的通知標題和消息。
不知道為什么會發生這種情況(代碼片段可能?),但是有一個重量級的終極解決方案:在清單中定義自己的c2dm接收器並將優先級設置為高(> 0)然后停止處理通知。
GCM消息作為有序廣播處理,因此您可以通過調用此方法來停止處理鏈:
https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()
如果您在接收器中沒有做任何事情,那么下一個接收器將進行處理,這將是Firebase接收器。
請注意 :Firebase正在發送遠程配置更改的推送通知。 因此,如果您使用遠程配置,則不建議禁止任何數據推送。
我有這個問題。並通過使用下面的代碼解決:
啟用Firebase通知:
FirebaseInstanceId.getInstance().getToken();
禁用Firebase通知: deleteInstanceId()是阻止調用。 它不能在主線程上調用。
FirebaseInstanceId.getInstance().deleteInstanceId();
您可以處理來自所有差異服務的所有推送事件(使用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
替換為您應用的套餐。 就這樣。 如果要訂閱其他推送服務,則必須添加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");
也許它對使用主題通知的APP很有用。 它不會在前台和后台收到通知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.