【问题标题】:What is FCM token in Firebase?Firebase 中的 FCM 令牌是什么?
【发布时间】:2016-10-06 21:14:06
【问题描述】:

在新的 Firebase 中,在通知下,他们提到开发人员可以向特定设备发送通知。为此,在控制台中它要求提供 FCM 令牌。它到底是什么,我怎样才能得到那个令牌?

【问题讨论】:

    标签: android firebase firebase-cloud-messaging firebase-notifications


    【解决方案1】:

    究竟是什么?

    FCM 令牌,或通常称为registrationToken,如。如 GCM FCM docs:

    中所述

    GCM 连接服务器向客户端应用发出的 ID,允许其接收消息。请注意,注册令牌必须保密。


    我怎样才能得到那个令牌?

    更新:仍然可以通过调用getToken() 来检索令牌,但是,根据 FCM 的最新版本,FirebaseInstanceIdService.onTokenRefresh() 已替换为FirebaseMessagingService.onNewToken() - 根据我的经验@ 987654324@.


    旧答案:

    根据FCM docs

    在您的应用首次启动时,FCM SDK 会为客户端应用实例生成一个注册令牌。如果您想定位单个设备或创建设备组,则需要访问此令牌。

    您可以通过扩展 FirebaseInstanceIdService 来访问令牌的值。确保您已将服务添加到清单中,然后在 onTokenRefresh 的上下文中调用 getToken,并记录如下所示的值:

    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);
    
        // TODO: Implement this method to send any registration to your app's servers.
        sendRegistrationToServer(refreshedToken);
    }
    

    每当生成新令牌时都会触发 onTokenRefreshcallback,因此在其上下文中调用 getToken 可确保您访问的是当前可用的注册令牌。如果尚未生成令牌,FirebaseInstanceID.getToken() 将返回 null。

    获取令牌后,您可以将其发送到您的应用服务器并使用您喜欢的方法进行存储。有关 API 的完整详细信息,请参阅实例 ID API 参考。

    【讨论】:

    • 第一次生成 FCM 令牌时?是否需要像 firebase 存储一样的 firebase 身份验证?
    • registrationToken 通常在首次安装应用程序时首次生成。并且遵循通常的过程。您必须将生成的registrationToken 发送到您的应用服务器。抱歉,您能否详细说明是否需要像 firebase 存储一样需要 firebase 身份验证
    • @AL 我们很快就会恢复将该值称为服务器密钥,因为将其称为令牌只会引入更多混乱。这里的 OP 显然是在询问客户端设备令牌,所以我不会在这里谈论服务器密钥/令牌。
    • @Al 非常感谢 .. 实际上在 ios 中,您需要设备令牌和注册令牌才能从服务器端成功进行推送通知调用。所以我们只用 onTokenRefreshed() 和 tinggg 中收到的令牌对其进行了测试!它奏效了
    【解决方案2】:

    他们在以下发行说明中弃用了 getToken() 方法。相反,我们必须使用 getInstanceId。

    https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId

    Task<InstanceIdResult> task = FirebaseInstanceId.getInstance().getInstanceId();
    task.addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
          @Override
          public void onSuccess(InstanceIdResult authResult) {
              // Task completed successfully
              // ...
              String fcmToken = authResult.getToken();
          }
    });
    
    task.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        // Task failed with an exception
        // ...
    }
    });
    

    要在同一个侦听器中处理成功和失败,请附加一个 OnCompleteListener:

    task.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
    @Override
    public void onComplete(@NonNull Task<InstanceIdResult> task) {
        if (task.isSuccessful()) {
            // Task completed successfully
            InstanceIdResult authResult = task.getResult();
            String fcmToken = authResult.getToken();
        } else {
            // Task failed with an exception
            Exception exception = task.getException();
        }
    }
    });
    

    此外,不推荐使用 FirebaseInstanceIdService 类,他们在 FireBaseMessagingService 中提出了 onNewToken 方法来替代 onTokenRefresh,

    您可以在此处参考发行说明, https://firebase.google.com/support/release-notes/android

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Use this code logic to send the info to your server.
        //sendRegistrationToServer(s);
    }
    

    【讨论】:

      【解决方案3】:

      FirebaseInstanceIdService 现已弃用。您应该在 FirebaseMessagingService 的 onNewToken 方法中获取 Token。

      Check out the docs

      【讨论】:

        【解决方案4】:

        我有一个关于“Firebase 云消息传递令牌”的更新,我可以获得信息。

        我真的很想知道这个变化,所以我给支持团队发了一封邮件。 Firebase 云消息传递令牌将很快再次返回服务器密钥。不会有任何改变。很快我们就可以再次看到服务器密钥了。

        【讨论】:

        【解决方案5】:

        这里是简单的步骤 添加这个gradle:

        dependencies {
          compile "com.google.firebase:firebase-messaging:9.0.0"
        }
        

        像 GCM 这样的清单不需要额外的权限。 不需要像 GCM 那样显示的接收器。使用 FCM,会自动添加 com.google.android.gms.gcm.GcmReceiver

        迁移您的侦听器服务

        现在仅当您想要访问 FCM 令牌时才需要扩展 InstanceIDListenerService 的服务。

        如果你愿意,这是必需的

        • 管理设备令牌以直接向单个设备发送消息,或 向设备组发送消息,或
        • 向设备组发送消息,或
        • 使用服务器订阅管理 API 为设备订阅主题。

        在清单中添加服务

        <service
            android:name=".MyInstanceIDListenerService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
        
        <service
            android:name=".MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
        

        MyInstanceIDListenerService 更改为扩展FirebaseInstanceIdService,并更新代码以侦听令牌更新并在生成新令牌时获取令牌。

        public class MyInstanceIDListenerService extends FirebaseInstanceIdService {
        
          ...
        
          /**
           * Called if InstanceID token is updated. This may occur if the security of
           * the previous token had been compromised. Note that this is also called
           * when the InstanceID token is initially generated, so this is where
           * you retrieve the token.
           */
          // [START refresh_token]
          @Override
          public void onTokenRefresh() {
              // Get updated InstanceID token.
              String refreshedToken = FirebaseInstanceId.getInstance().getToken();
              Log.d(TAG, "Refreshed token: " + refreshedToken);
              // TODO: Implement this method to send any registration to your app's servers.
              sendRegistrationToServer(refreshedToken);
          }
        
        }
        

        欲了解更多信息,请访问

        1. How to import former GCM Projects into Firebase
        2. How to force a token refresh
        3. How to access the token
        4. How to set up firebase

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-05
          • 2019-07-16
          • 1970-01-01
          • 2017-03-28
          • 2016-09-24
          • 2023-04-03
          • 2016-10-13
          相关资源
          最近更新 更多