Skip to content Skip to sidebar Skip to footer

Unsubscribe From All Topics At Once From Firebase Messaging

Is there any way to unsubscribe from all topics at once? I'm using Firebase Messaging to receive push notification from some topics subscribed, and somehow I need to unsubscribe f

Solution 1:

You can use Instance API to query all the available topics subscribed to given token and than call multiple request to unsubscribe from all the topics.

However, if you want to stop receiving from all the topics and then the token is not useful at all, you can call FirebaseInstanceId.getInstance().deleteInstanceId() (reference: deleteInstanceId() and surround with a try/catch for a potential IOException) that will reset the instance id and than again you can subscribe to new topics from the new instance id and token.

Hope this helps someone.

Solution 2:

For Java users:

If you want to do it topic wise, refer others answers and If you want to stop recieving FCM push notification, do below:

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            FirebaseInstanceId.getInstance().deleteInstanceId();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();

I have placed deleteInstanceId() in a separate thread to stop java.io.IOException: MAIN_THREAD W/System.err and wrapped with try / catch to handle IOException.

Solution 3:

If you want to avoid deleting InstanceId and moreover, to avoid missing some of the subscribed topics when saved in a local database or a remote database due to highly probable buggy implementation.

First get all subscribed topics:

var options = BaseOptions(headers: {'Authorization':'key = YOUR_KEY'});
    var dio = Dio(options);
    var response = await dio.get('https://iid.googleapis.com/iid/info/' + token,
                             queryParameters: {'details': true});
    Map<String, dynamic> subscribedTopics = response.data['rel']['topics'];

Get your key here: Firebase console -> your project -> project settings -> cloud messaging -> server key

Get your token as:

var firebaseMessaging = FirebaseMessaging();
String token;
firebaseMessaging.getToken().then((value) {
  token = value;
});

Now unsubscribe from all topics:

  Future<void> unsubscribeFromAllTopics() async {
    for (var entry in subscribedTopics.entries) {
      await Future.delayed(Duration(milliseconds: 100)); // throttle due to 3000 QPS limitunawaited(firebaseMessaging.unsubscribeFromTopic(entry.key)); // import pedantic for unawaiteddebugPrint('Unsubscribed from: ' + entry.key);
    }
  }

All code is in Dart.

For more information about instance id: https://developers.google.com/instance-id/reference/server

Solution 4:

Keep a private list of subscribed topics in Preferences.

It's not that hard. Here's what I do:

publicclassPushMessagingSubscription {

  privatestaticSharedPreferences topics;

  publicstaticvoidinit(ApplicationSingleton applicationSingleton) {
    topics = applicationSingleton.getSharedPreferences("pushMessagingSubscription", 0);
  }

  publicstaticvoidsubscribeTopic(String topic) {
    if (topics.contains(topic)) return; // Don't re-subscribe
    topics.edit().putBoolean(topic, true).apply();

    // Go on and subscribe ...
  }


  publicstaticvoidunsubscribeAllTopics() {
    for (String topic : topics.getAll().keySet()) {
      FirebaseMessaging.getInstance().unsubscribeFromTopic(topic);
    }
    topics.edit().clear().apply();
    // FirebaseInstanceId.getInstance().deleteInstanceId();
  }
}

Solution 5:

I know this is not the best way but it works! You can store list of all topics in Database and then unsubscribe from all topics when user sign-outs

final FirebaseMessaging messaging= FirebaseMessaging.getInstance();
      FirebaseDatabase.getInstance().getReference().child("topics").addChildEventListener(newChildEventListener() {
          @OverridepublicvoidonChildAdded(DataSnapshot dataSnapshot, String s) {
              String topic  = dataSnapshot.getValue(String.class);
              messaging.unsubscribeFromTopic(topic);
}...//rest code

Post a Comment for "Unsubscribe From All Topics At Once From Firebase Messaging"