繁体   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