Firebase(FCM)如何获取令牌

这是我第一次使用FCM。

我从firebase / quickstart-android下载了一个示例,我安装了FCM快速入门。但是我不能从日志中得到任何令牌,甚至在应用程序中点击LOG TOKENbutton

然后,我尝试使用Firebase控制台发送消息,并将其设置为定位到我的应用程序包名称。我收到了任何传入的消息。

我想知道FCM可以使用吗?GCM一切正常。

解:

因为我不是一个Android开发人员,只是一个后端开发人员。所以我花了一些时间来解决这个问题。在我看来,示例应用程序中存在一些bug。

在这里输入图像说明

码:

RegistrationIntentService.java

public class RegistrationIntentService extends IntentService { private static final String TAG = "RegIntentService"; public RegistrationIntentService() { super(TAG); } @Override protected void onHandleIntent(Intent intent) { String token = FirebaseInstanceId.getInstance().getToken(); Log.i(TAG, "FCM Registration Token: " + token); } } 

MyFirebaseInstanceIDService.java

 public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = "MyFirebaseIIDService"; /** * Called if InstanceID token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the InstanceID token * is initially generated so this is where you would 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); // Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } // [END refresh_token] /** * Persist token to third-party servers. * <p> * Modify this method to associate the user's FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // Add custom implementation, as needed. } } 

将其添加到MainActivity.java中。

  Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); 

做完以上之后,你可以在logcat中获得Token。但是最后我find了一个方便的方法来获取它。 只需使用debugging模式安装示例应用程序,并且您可以在第一次安装示例应用程序时获取该令牌。

但是我不t why it can打印日志。可能与移动系统有关。

那为什么我不能得到通知。 FirebaseMessagingService.onMessageReceived未调用sendNotification

Solutions Collecting From Web of "Firebase(FCM)如何获取令牌"

为我工作

 Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken()); 

重要信息。

如果谷歌播放服务挂起或不运行,然后fcm返回标记= null

根据文件

将GCM客户端应用程序迁移到FCM

 onTokenRefresh() 

仅在InstanceID令牌更新时调用

所以只有在您第一次将应用程序安装到您的设备时才会打电话。

所以我build议请手动卸载您的应用程序,并尝试再次运行

肯定你会得到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); // Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } // [END refresh_token] 

做这个:

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

还有一件事:

你需要调用sendRegistrationToServer()方法,这将更新服务器上的令牌,如果你从服务器发送推送通知。

更新:

生成新的Firebase标记( onTokenRefresh()被调用)时:

  • 该应用程序删除实例ID
  • 该应用程序在一个新的设备上恢复
  • 用户卸载/重新安装应用程序
  • 用户清除应用程序数据。

尝试这个。 你为什么使用RegistrationIntentService

 public class FirebaseInstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { } } 

同时不要忘记在你的清单文件中包含这个接收令牌ID

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

如果正在使用FB的一些authenticationfunction,你可以使用这个令牌:

 //------GET USER TOKEN------- FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser(); mUser.getToken(true) .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { public void onComplete(@NonNull Task<GetTokenResult> task) { if (task.isSuccessful()) { String idToken = task.getResult().getToken(); // ... } } }); 

如果用户被logging,则工作良好。 getCurrentUser()

此行应该为您提供Firebase FCM令牌。

 String token = FirebaseInstanceId.getInstance().getToken(); Log.d("MYTAG", "This is your Firebase token", + token); 

做Log.d打印出来的Android监视器。