web-dev-qa-db-ja.com

Firebase on Android-Firebase notification on Android client

Firebaseコンソールを使用してユーザーに通知を送信しています。ただし、ユーザーが通知を無効にできるようにします。それらを無効にするにはどうすればよいですか?

アプリがフォアグラウンドにある場合にのみ、FirebaseMessagingServiceを介して通知を処理(および停止)できます。しかし、アプリがバックグラウンドにあるときに通知を停止することはできません。

12
martinodecarlo

なぜこれがあなたに起こるのかわかりません(おそらくコードスニペットですか?)が、重い究極の解決策があります:マニフェストで独自のc2dmレシーバーを定義し、優先度を高く(> 0)設定し、通知の処理を停止します。

GCMメッセージは順序付けられたブロードキャストとして処理されるため、次のメソッドを呼び出して処理チェーンを停止できます。

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

レシーバーで何もしなければ、次のレシーバーが処理を行います。これがFirebaseレシーバーです。

注意してください:Firebaseはリモート設定の変更に対してプッシュ通知を送信しています。したがって、Remote Configを使用する場合、データプッシュを抑制することはお勧めできません。

5
racs

まだコメントできませんでしたが、 racs 'comment が非常に役立ちました。

実際、Firebaseのドキュメントでは、処理方法を完全に制御したい場合は、通知の代わりにデータプッシュを使用することをお勧めします。クライアントアプリの代わりに通知を表示します。アプリで表示を処理したり、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()を呼び出し、取得した通知タイトルとメッセージをプッシュデータで使用するようにメソッドを変更しました。

12
Alvin Rusli

私はこの問題を抱えていて、コードの下で使用して解決しました:

Firebase通知を有効にする:

FirebaseInstanceId.getInstance().getToken();

Firebase通知を無効にする: deleteInstanceId()はブロッキングコールです。メインスレッドで呼び出すことはできません。

FirebaseInstanceId.getInstance().deleteInstanceId();
3
Better

私も同じ質問に答えます。私はsubscribeToTopicAPIを使用して通知をサブスクライブします。

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

そして、他のAPInsubscribeFromTopicがサブスクライブを解除します。

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

たぶん、トピック通知を使用するAPPに役立つでしょう。フォアグラウンドおよびバックグラウンドで通知を受信しません。

2
Fantasy Fang

すべての異なるサービスからのすべてのプッシュイベントを処理できます(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>
2
TarikW