在新的Firebase中,在通知下,他们提到开发人员可以向特定设备发送通知。为此,在控制台中它要求一个FCM令牌。究竟是什么,如何获得该令牌?
答案 0 :(得分:51)
究竟是什么?
FCM令牌,或google-cloud-messaging中常见的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
的服务。
如果您想
,则需要这样做在清单
中添加服务<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);
}
}
欲了解更多信息,请访问
答案 2 :(得分:3)
FirebaseInstanceIdService现在已弃用。您应该在FirebaseMessagingService的onNewToken方法中获取令牌。
答案 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);
}