在新的 Firebase 中,在 Notification 下,他们提到开发人员可以向特定设备发送通知。为此,在控制台中它要求提供 FCM 令牌。它到底是什么,我怎样才能得到那个令牌?
5 回答
究竟是什么?
registrationToken
FCM 令牌,或者在google-cloud-messaging中通常称为类似。如GCM FCM 文档中所述:
GCM 连接服务器向客户端应用程序发出的 ID,允许其接收消息。请注意,注册令牌必须保密。
我怎样才能得到那个令牌?
更新:仍然可以通过调用来检索令牌getToken()
,但是,根据 FCM 的最新版本,FirebaseInstanceIdService.onTokenRefresh()
已被替换为-- 根据我FirebaseMessagingService.onNewToken()
的经验,其功能与onTokenRefresh()
.
老答案:
根据FCM 文档:
在您的应用程序首次启动时,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 参考。
这是添加此 gradle 的简单步骤:
dependencies {
compile "com.google.firebase:firebase-messaging:9.0.0"
}
像 GCM 这样的清单不需要额外的权限。不需要像 GCM 那样显示的接收器。使用 FCM,com.google.android.gms.gcm.GcmReceiver
会自动添加。
迁移您的侦听器服务
InstanceIDListenerService
现在,仅当您要访问 FCM 令牌时才需要服务扩展。
如果您想这样做,这是必需的
- 管理设备令牌以直接向单个设备发送消息,或 向设备组发送消息,或
- 向设备组发送消息,或
- 使用服务器订阅管理 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
为 extend 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);
}
}
欲了解更多信息,请访问
他们在以下发行说明中弃用了 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);
}
FirebaseInstanceIdService 现已弃用。您应该在 FirebaseMessagingService 的 onNewToken 方法中获取 Token。
我有关于“Firebase 云消息传递令牌”的更新,我可以获得信息。
我真的很想知道这个变化,所以就给支持团队发了一封邮件。Firebase 云消息传递令牌将很快再次返回服务器密钥。不会有任何改变。不久之后我们可以再次看到服务器密钥。