过去几天,我试图使FCM在我的应用程序中运行,我发现不赞成onTokenRefreshed()函数和FirebaseInstanceIdService。 因此,我在网上关注了一些Firebase文档和教程,但似乎没有一个对我有用。 我的MyFirebaseMessagingService类是:
package com.example.android.aln4.Classes;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMessaging";
@Override
public void onNewToken(String token) {
super.onNewToken(token);
Log.d(TAG,"Refreshed token: "+token);
}
}
我的清单包含以下代码:
<service android:name=".Classes.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
此外,我所有与firebae相关的实现都是最新的,如下所示:
//Firebase
implementation 'com.google.firebase:firebase-crash:16.2.1'
implementation 'com.firebase:firebase-client-android:2.5.2'
implementation 'com.google.firebase:firebase-core:16.0.6'
implementation 'com.google.firebase:firebase-database:16.0.6'
implementation 'com.firebase:firebase-client-android:2.5.2'
implementation 'com.firebaseui:firebase-ui-database:2.1.1'
implementation 'com.google.firebase:firebase-storage:16.0.5'
implementation 'com.google.firebase:firebase-firestore:18.0.0'
implementation 'com.google.firebase:firebase-messaging:17.3.4'
一般而言,我的问题是,无论何时运行应用程序,无论是在卸载和安装之后还是正常运行时,都不会调用onNewToken()函数,或者至少我看不到它在Logcat中。 任何形式的帮助都可以申请:)
答案 0 :(得分:2)
onNewToken()仅在生成新令牌或现有令牌已更新时被调用。
您可以添加以下代码,然后在应用中的任何位置调用以随时获取令牌。
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "getInstanceId failed", task.getException());
return;
}
// Get new Instance ID token
String token = task.getResult().getToken();
}
});
答案 1 :(得分:1)
onNewToken 方法,您应该在活动中检索该令牌。
将此添加到您的活动中:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(SplashActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String token = instanceIdResult.getToken();
Log.i("FCM Token", token);
saveToken(token);
}
});
答案 2 :(得分:1)
2020年12月更新:使用新的Firebase SDK(21.0.0),您可以在范围内通过FirebaseInstallations.getInstance()
获得令牌:
FirebaseInstallations.getInstance().getToken(false).addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
@Override
public void onComplete(@NonNull Task<InstallationTokenResult> task) {
if(!task.isSuccessful()){
return;
}
// Get new Instance ID token
String token = task.getResult().getToken();
}
});
答案 3 :(得分:1)
使用 android studio 的 firebase 助手工具将您的应用程序连接到 FCM 后,在您的 MainAcitivity 类上使用此代码来检索 firebase 云消息传递令牌:(此代码对我有用强>)
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
if (!task.isSuccessful) {
Toast.makeText(this, "${task.exception}", Toast.LENGTH_LONG).show()
return@OnCompleteListener
}
// Get FCM registration token
val token = task.result
if (token != null) {
Toast.makeText(this, token, Toast.LENGTH_LONG).show()
}
})
答案 4 :(得分:0)
使用此:
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
答案 5 :(得分:0)
您只需要onNewToken()来通知您的应用程序它需要再次发送令牌。
您可以在应用的某个入口点执行此操作:
private void doPushCheck() throws ExecutionException, InterruptedException {
if (isPushTokenAlreadySent()) {
return;
}
Task<InstanceIdResult> instanceId = FirebaseInstanceId.getInstance().getInstanceId();
Tasks.await(instanceId);
InstanceIdResult result = instanceId.getResult();
if (result != null) {
String sPushToken = result.getToken();
if (!TextUtils.isEmpty(sPushToken)) {
[send token to your backend and verify your server response]
setPushTokenSent(true);
}
}
}
在on onNewToken()方法覆盖上,您可以简单地执行以下操作:
@Override
public void onNewToken(@NonNull String sPushToken) {
setPushTokenSent(false);
}
方法isPushTokenAlreadySent()和setPushTokenSent()可能是您持久保存数据的最佳方式,例如,使用SharedPreferences:
private boolean isPushTokenAlreadySent() {
SharedPreferences preferences = getApplicationContext().getSharedPreferences("push_token", Context.MODE_PRIVATE);
return preferences.getBoolean("registered", false);
}
private void setPushTokenSent(boolean bSent) {
SharedPreferences preferences = getApplicationContext().getSharedPreferences("push_token", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
preferences.getBoolean("registered", bSent);
editor.apply();
}
答案 6 :(得分:0)
接收这样的令牌(Kotlin):
FirebaseMessaging.getInstance().token.result?.let{ Log.e(TAG, "onCreate: $it")}