有没有办法一次取消订阅所有主题?
我正在使用Firebase Messaging从订阅的某些主题接收推送通知,不知何故,我需要取消订阅所有主题,而不必逐个取消订阅。这可能吗?
答案 0 :(得分:13)
您可以使用Instance API查询订阅给定令牌的所有可用主题,然后调用多个请求取消订阅所有主题。
但是,如果您想停止接收所有主题,然后令牌根本没用,您可以致电FirebaseInstanceId.getInstance().deleteInstanceId()
(参考:deleteInstanceId()并使用try / catch环绕潜在的IOException)将重置实例ID,而且您可以再次从新的实例ID和令牌订阅新主题。
希望这有助于某人。
答案 1 :(得分:2)
我知道这不是最好的方法,但它有效! 您可以在数据库中存储所有主题的列表,然后在用户注销时取消订阅所有主题
final FirebaseMessaging messaging= FirebaseMessaging.getInstance();
FirebaseDatabase.getInstance().getReference().child("topics").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String topic = dataSnapshot.getValue(String.class);
messaging.unsubscribeFromTopic(topic);
}...//rest code
答案 2 :(得分:2)
如果要避免删除InstanceId并避免由于极有可能的错误实现而将其保存在本地数据库或远程数据库中时丢失一些已订阅的主题。
首先获取所有订阅的主题:
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'];
在此处获取密钥: Firebase控制台->您的项目->项目设置->云消息传递->服务器密钥
获取令牌为:
var firebaseMessaging = FirebaseMessaging();
String token;
firebaseMessaging.getToken().then((value) {
token = value;
});
现在退订所有主题:
Future<void> unsubscribeFromAllTopics() async {
for (var entry in subscribedTopics.entries) {
await Future.delayed(Duration(milliseconds: 100)); // throttle due to 3000 QPS limit
unawaited(firebaseMessaging.unsubscribeFromTopic(entry.key)); // import pedantic for unawaited
debugPrint('Unsubscribed from: ' + entry.key);
}
}
所有代码都在Dart中。
有关实例ID的更多信息: https://developers.google.com/instance-id/reference/server
答案 3 :(得分:0)
在“首选项”中保留已订阅主题的私人列表。
这并不难。这是我的工作:
public class PushMessagingSubscription {
private static SharedPreferences topics;
public static void init(ApplicationSingleton applicationSingleton) {
topics = applicationSingleton.getSharedPreferences("pushMessagingSubscription", 0);
}
public static void subscribeTopic(String topic) {
if (topics.contains(topic)) return; // Don't re-subscribe
topics.edit().putBoolean(topic, true).apply();
// Go on and subscribe ...
}
public static void unsubscribeAllTopics() {
for (String topic : topics.getAll().keySet()) {
FirebaseMessaging.getInstance().unsubscribeFromTopic(topic);
}
topics.edit().clear().apply();
// FirebaseInstanceId.getInstance().deleteInstanceId();
}
}
答案 4 :(得分:0)
对于Java用户:
如果您希望按主题进行操作,请参考其他答案;如果您要停止接收 FCM推送通知,请执行以下操作:
new Thread(new Runnable() {
@Override
public void run() {
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
我已将deleteInstanceId()
放在一个单独的线程中以停止java.io.IOException: MAIN_THREAD W/System.err
,并用try / catch
包裹起来处理IOException
。
答案 5 :(得分:0)
Firebase.messaging.deleteToken()
是 2021 年的实际答案。
答案 6 :(得分:-1)
try {
FirebaseInstallations.getInstance().delete()
} catch (e: IOException) {
}
答案 7 :(得分:-6)
您可以使用:
FirebaseMessaging.getInstance().unsubscribeFromTopic("Topic name");