Firebase中的FCM令牌是什么?

时间:2016-06-07 05:43:32

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

在新的Firebase中,在通知下,他们提到开发人员可以向特定设备发送通知。为此,在控制台中它要求一个FCM令牌。究竟是什么,如何获得该令牌?

5 个答案:

答案 0 :(得分:51)

究竟是什么?

FCM令牌,或中常见的registrationToken。如GCM docs

中所述
  

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

我如何获得该令牌?

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

旧答案:

根据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的完整详细信息,请参阅Instance ID API参考。

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

答案 2 :(得分:3)

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

Check out the docs

答案 3 :(得分:2)

我有关于&#34; Firebase云消息令牌的更新&#34;我可以得到一个信息。

我真的很想知道这个变化,所以只是发送邮件给支持团队。 Firebase Cloud Messaging令牌将很快再次返回到服务器密钥。没有什么可以改变的。我们很快就会再次看到服务器密钥。

答案 4 :(得分: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);
}