从 firebase 云消息传递中获取所有订阅的主题
Get all subscribed topics from firebase cloud messaging
使用新的 FirebaseMessaging 可以很容易地 un/subscribe 通过以下方式访问主题:
FirebaseMessaging.getInstance().subscribeToTopic();
FirebaseMessaging.getInstance().unsubscribeFromTopic();
但是有没有办法获取当前安装订阅的所有主题?
我搜索了 Android API,在 SO 上询问了相同的问题,但没有找到任何内容。 Android API 中没有任何内容可以获取特定令牌的所有主题。
但是,您可以通过 GET 请求来完成
HTTP GET 请求
https://iid.googleapis.com/iid/info/<TOKEN>?details=true
Content-Type:application/json
Authorization:key=AAA....i1nM:APA9.....81gTPXCE55....JLPEG0wZobG_ile8lI35JTzHYE5MC..BmDD_Cxj5OxB1Yh....Rs5lo3UwLNL9h-WcocGV....b5bYWNI55kzNsrHK-7GljUDtMn
TOKEN 在 url 中:FirebaseInstanceId.getInstance().getToken(senderId, scope);
key :可以在 firebase console 中找到:您的项目 -> 设置 -> 项目设置 -> 云消息 -> 服务器密钥
注意:查找密钥时要小心,不要使用 web api 密钥不同。
senderId
可以在设置 -> 云消息 -> 发件人 ID
中找到
scope
通常是 "FCM"
对于那些想用命令行 CURL 测试它的人,请遵循我使用的语法:
#curl --location --request GET 'https://iid.googleapis.com/iid/info/yourFCMDeviceToken?details=true' \
--header 'Authorization: Bearer YourProject_CloudMessaging_ServerKey'
回复:
{
applicationVersion: '4194309',
application: 'com.domain.app',
scope: '*',
authorizedEntity: '913674269572',
rel: { topics: { topicName: { addDate: '2020-08-19' } } },
appSigner: 'ae7cbSomeHash23jsdfff34ac7ffd',
platform: 'ANDROID'
}
这个主题仍然相关,iOS SDK 中仍然没有 API。
如果您的目标是防止用户多次订阅同一主题并因此多次收到通知(例如,群组中的一条评论),我的解决方案是使用 UserDefaults 的简单本地缓存。
非常简单:
func subscribeTo(topic: String){
// first check that the user isn't already
// subscribed, or they get multiple notifications
let localFlag = UserDefaults.standard.bool(forKey: topic)
if localFlag == true {
print("user already subscribed to topic: \(topic)")
return
}
print("attempting to subscribe user to topic: \(topic)")
// Subscribe to comet chat push notifications through Firebase
Messaging.messaging().subscribe(toTopic: topic) { error in
if error == nil {
print("subscribed CometChat user to topic: \(topic)")
// set local flag as "already subbed"
UserDefaults.standard.setValue(true, forKey: topic)
return
}
print("attempt to subscribe CometChat user to topic \(topic) failed: \(error?.localizedDescription ?? "(no error provided)")")
}
}
我的应用程序流程让用户登录,然后自动获取与用户关联的主题列表,并在每次启动时 auto-subscribes 到该主题。
这样做的原因是高度保证用户会收到通知。
流程:
用户启动应用程序 -> 检索主题 -> 迭代并传递主题以订阅 func -> 如果主题 == true 则阻止 -> 如果主题 != true
通过
然后我们当然会在取消订阅时将 nil
分配给主题键的本地布尔值。
没有这种阻止/检查,取消订阅总是成功的,因为当用户不想要通知时,更保守的 UX 更好。
干杯。
从未以编程方式尝试过。
但是您可以通过转到 firebase 控制台->您的项目->云消息传递->新通知->目标->单击用户细分旁边的主题选项卡来完成,只需单击消息主题文本框,您将获得列表订阅的主题
使用新的 FirebaseMessaging 可以很容易地 un/subscribe 通过以下方式访问主题:
FirebaseMessaging.getInstance().subscribeToTopic();
FirebaseMessaging.getInstance().unsubscribeFromTopic();
但是有没有办法获取当前安装订阅的所有主题?
我搜索了 Android API,在 SO 上询问了相同的问题,但没有找到任何内容。 Android API 中没有任何内容可以获取特定令牌的所有主题。
但是,您可以通过 GET 请求来完成
HTTP GET 请求
https://iid.googleapis.com/iid/info/<TOKEN>?details=true
Content-Type:application/json
Authorization:key=AAA....i1nM:APA9.....81gTPXCE55....JLPEG0wZobG_ile8lI35JTzHYE5MC..BmDD_Cxj5OxB1Yh....Rs5lo3UwLNL9h-WcocGV....b5bYWNI55kzNsrHK-7GljUDtMn
TOKEN 在 url 中:FirebaseInstanceId.getInstance().getToken(senderId, scope);
key :可以在 firebase console 中找到:您的项目 -> 设置 -> 项目设置 -> 云消息 -> 服务器密钥
注意:查找密钥时要小心,不要使用 web api 密钥不同。
senderId
可以在设置 -> 云消息 -> 发件人 ID
scope
通常是 "FCM"
对于那些想用命令行 CURL 测试它的人,请遵循我使用的语法:
#curl --location --request GET 'https://iid.googleapis.com/iid/info/yourFCMDeviceToken?details=true' \
--header 'Authorization: Bearer YourProject_CloudMessaging_ServerKey'
回复:
{
applicationVersion: '4194309',
application: 'com.domain.app',
scope: '*',
authorizedEntity: '913674269572',
rel: { topics: { topicName: { addDate: '2020-08-19' } } },
appSigner: 'ae7cbSomeHash23jsdfff34ac7ffd',
platform: 'ANDROID'
}
这个主题仍然相关,iOS SDK 中仍然没有 API。
如果您的目标是防止用户多次订阅同一主题并因此多次收到通知(例如,群组中的一条评论),我的解决方案是使用 UserDefaults 的简单本地缓存。
非常简单:
func subscribeTo(topic: String){
// first check that the user isn't already
// subscribed, or they get multiple notifications
let localFlag = UserDefaults.standard.bool(forKey: topic)
if localFlag == true {
print("user already subscribed to topic: \(topic)")
return
}
print("attempting to subscribe user to topic: \(topic)")
// Subscribe to comet chat push notifications through Firebase
Messaging.messaging().subscribe(toTopic: topic) { error in
if error == nil {
print("subscribed CometChat user to topic: \(topic)")
// set local flag as "already subbed"
UserDefaults.standard.setValue(true, forKey: topic)
return
}
print("attempt to subscribe CometChat user to topic \(topic) failed: \(error?.localizedDescription ?? "(no error provided)")")
}
}
我的应用程序流程让用户登录,然后自动获取与用户关联的主题列表,并在每次启动时 auto-subscribes 到该主题。
这样做的原因是高度保证用户会收到通知。
流程: 用户启动应用程序 -> 检索主题 -> 迭代并传递主题以订阅 func -> 如果主题 == true 则阻止 -> 如果主题 != true
通过然后我们当然会在取消订阅时将 nil
分配给主题键的本地布尔值。
没有这种阻止/检查,取消订阅总是成功的,因为当用户不想要通知时,更保守的 UX 更好。
干杯。
从未以编程方式尝试过。
但是您可以通过转到 firebase 控制台->您的项目->云消息传递->新通知->目标->单击用户细分旁边的主题选项卡来完成,只需单击消息主题文本框,您将获得列表订阅的主题