如何从 Firebase 获取所有设备令牌?
Posted
技术标签:
【中文标题】如何从 Firebase 获取所有设备令牌?【英文标题】:How to get all of device tokens from Firebase? 【发布时间】:2017-08-21 00:18:42 【问题描述】:如何从 Firebase 获取设备令牌(FCM 注册令牌)?
我正在使用 firebase 制作移动应用程序,并使用 node.js 制作其服务器。
我想从服务器发送push notification
消息,但我不知道如何获取设备令牌。
如何从外部服务器获取设备令牌?我现在正在使用 Firebase 管理 SDK。
设备token是不是只有app连接fcm服务器时才会生成?
当用户首次运行应用并注册 FCM 服务器时,我应该将令牌保存到另一个数据库吗?
【问题讨论】:
【参考方案1】:我建议根本不要存储令牌。存储令牌似乎是个好主意,直到您意识到您的用户有多个设备(ios 设备、android 设备、桌面等)。现在您必须管理为每个用户存储多个设备令牌,这可能会很快变得混乱。
相反,忽略生成的令牌并简单地为每个用户订阅一个主题,例如当用户登录或创建帐户时为他们订阅由他们的用户 ID 组成的主题
NSString* useridchannel = [NSString stringWithFormat:@"user_%ld", (long)userid];
[[FIRMessaging messaging] subscribeToTopic:useridchannel completion:^(NSError * _Nullable error)
NSLog(@"Subscribed user to topic %@", useridchannel);
];
当用户注销时,请确保取消订阅该主题,因为如果他们不再登录您的应用,他们可能不想收到通知
NSString* useridchannel = [NSString stringWithFormat:@"user_%ld", (long)userid];
[[FIRMessaging messaging] unsubscribeFromTopic:useridchannel completion:^(NSError * _Nullable error)
NSLog(@"Unsubscribed user from %@", useridchanel);
];
我意识到设备组应该用于此目的,但我不想再为存储和管理令牌而烦恼,而且适用于 php 的 Firebase Admin SDK 也不支持向设备组发送消息。通过使用主题,无需处理设备令牌,您可以轻松地从服务器、应用程序或 Firebase 控制台向所有用户设备发送消息。
【讨论】:
这样做的问题是无法将发送到主题的消息设为私有。 IE。如果某个演员猜到了主题路径,他们也可以订阅它。 公平点。您可以通过为每个用户生成自己的令牌来更好地保护这一点,例如(n)位随机字母、数字、特殊字符将其存储在数据库中并使用它而不是用户 ID。【参考方案2】:您可以向
发出获取请求https://<<your_project_name>>.firebaseio.com/.json?auth=<<your_database_secret_key>>
您在 Firebase 控制台settings/serviceaccounts/databasesecrets
标签下获得的数据库密钥
这将返回一个 JSON 文件,其中包含您项目的所有存储数据。
【讨论】:
@RaviSharma 当您输入我使用参数发布的网址时,它会返回任何内容吗? 它返回 null。【参考方案3】:设备令牌在应用首次连接时生成,此令牌必须存储在您的数据库中,并在分配新令牌时替换
public class MyAndroidFirebaseInstanceIdService extends FirebaseInstanceIdService
private static final String TAG = "MyAndroidFCMIIDService";
@Override
public void onTokenRefresh()
//Get hold of the registration token
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//Log the token
Log.d(TAG, "Refreshed token: " + refreshedToken);
private void sendRegistrationToServer(String token)
//Implement this method if you want to store the token on your server
查看以下Tutorial
【讨论】:
【参考方案4】:1.如何从外部服务器获取设备令牌?我现在正在使用 Firebase 管理 SDK。
目前没有 API 可以从服务器端检索您的应用的所有注册令牌。开发者(您)有责任将注册令牌发送并存储到您的应用服务器,该令牌是从客户端应用端生成的。
2.是不是只有app连接FCM服务器时才会生成设备令牌?
documentation 几乎涵盖了这一点(另请参阅我的回答 here):
在您的应用首次启动时,FCM SDK 会为客户端应用实例生成一个注册令牌。
从技术上讲,它无法连接到 FCM 服务器。它连接到 FirebaseInstanceID 服务(通过 SDK),进而生成注册令牌。
3.当用户第一次运行应用程序并注册 FCM 服务器时,我应该将令牌保存到另一个数据库吗?
正如我在 #1 中提到的,您应该将其保存在可以轻松访问以发送消息的位置。
【讨论】:
难道我们不能只使用 google instance-id API 从 APNS 令牌生成 fcm 令牌并使用它向 iOS 设备发送推送通知而不集成 firebase SDK?我试过了,但是没有sdk集成,push是不行的。集成 SDK 后,相同的 API 开始返回正确的 fcm 令牌,这适用于推送。然后您实际上可以删除 firebase SDK 并仍然使用 firebase 接收推送通知。 Cant firebase 只是获取原始设备令牌并使用正确的证书或身份验证密钥发送推送通知。为什么必须包含 SDK? 将APNS令牌转换为fcm注册令牌的API描述如下:developers.google.com/instance-id/reference/…以上是关于如何从 Firebase 获取所有设备令牌?的主要内容,如果未能解决你的问题,请参考以下文章
从 APN 迁移到 Firebase 后未重新生成 iOS 设备令牌