簡體   English   中英

Android上的Firebase - 我想在Android客戶端上禁用firebase通知

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM