如何从 Firebase 获取所有设备令牌?

How to get all of device tokens from Firebase?

如何从 Firebase 获取设备令牌(FCM 注册令牌)?

我正在使用 firebase 制作移动应用,其服务器使用 node.js。

我想从服务器发送 push notification 消息,但我不知道如何获取设备令牌。

  1. 如何从外部服务器获取设备令牌?我现在正在使用 Firebase admin SDK。

  2. device token是不是只有app连接fcm server才会生成?

  3. 当用户第一次运行应用程序并注册FCM服务器时,我是否应该将令牌保存到另一个数据库?

设备令牌在应用首次连接时生成,此令牌随后必须存储在您的数据库中,并在分配新令牌时替换

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

1. How to get device tokens from external server? I'm using Firebase admin SDK now.

目前没有API从服务器端检索您的应用程序的所有注册令牌。开发者(您)有责任将注册令牌发送并存储到您的应用服务器,该令牌是从客户端应用程序端生成的。

2. Is the device token only generated when the app is connected FCM server?

documentation pretty much covered this (see also my answer ):

On initial startup of your app, the FCM SDK generates a registration token for the client app instance.

它在技术上没有连接到 FCM 服务器。它连接到 FirebaseInstanceID 服务(通过 SDK),后者又生成注册令牌。

3. Should I save token to another database when user first run the app and register FCM server?

正如我在 #1 中提到的,您应该将其保存在您可以轻松访问以发送消息的位置。

您可以向

发出获取请求
https://<<your_project_name>>.firebaseio.com/.json?auth=<<your_database_secret_key>>

settings/serviceaccounts/databasesecrets

选项卡下的 Firebase 控制台中获取的数据库密钥

此 returns 一个 JSON 文件,其中包含您项目的所有存储数据。

我建议根本不要存储令牌。存储令牌似乎是个好主意,直​​到您意识到您的用户有多个设备(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 控制台向所有用户设备发送消息。