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

时间:2017-03-28 04:51:55

标签: firebase react-native firebase-cloud-messaging firebase-admin

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

我使用firebase及其服务器使用node.js创建移动应用程序。

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

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

  2. 设备令牌是仅在应用程序连接到fcm服务器时生成的吗?

  3. 当用户首次运行应用并注册FCM服务器时,我应该将令牌保存到其他数据库吗?

4 个答案:

答案 0 :(得分:5)

  

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

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

  

2。是否仅在应用程序连接FCM服务器时生成设备令牌?

documentation几乎涵盖了这一点(另请参阅我的回答here):

  

在您的应用首次启动时,FCM SDK会为客户端应用实例生成注册令牌。

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

  

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

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

答案 1 :(得分: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

答案 2 :(得分:3)

我建议完全不存储令牌。在您意识到用户拥有多个设备(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);
}];

我意识到应该将设备组用于此目的,但是我又不想被存储和管理令牌所困扰,而且Firebase Admin SDK for PHP不支持向设备组发送消息。通过使用主题,无需处理设备令牌,您可以轻松地从服务器,应用程序或Firebase控制台向所有用户设备发送消息。

答案 3 :(得分:0)

您可以请求获取

https://<<your_project_name>>.firebaseio.com/.json?auth=<<your_database_secret_key>>

您在Firebase控制台中的标签settings/serviceaccounts/databasesecrets下获得的数据库密钥

这将返回一个JSON文件,其中包含项目的所有存储数据。