FirebaseInstanceIdService已弃用

希望你们所有人都知道这个类,用来获取通知令牌,每当firebase通知令牌被刷新时,我们从这个类获得刷新令牌,从下面的方法。

@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}

为了使用这个,因为我想实现FCM,我从FirebaseInstanceIdService扩展了MyClass

但是,显示FirebaseInstanceIdService已弃用

有人知道吗?, 我应该使用什么方法或类来代替这个来获得刷新令牌,因为这是不赞成的

我正在使用:implementation 'com.google.firebase:firebase-messaging:17.1.0'

我检查了文件,没有提到这一点。: FCM设置文件


更新

此问题已修复。

由于谷歌弃用了FirebaseInstanceService

我问了这个问题来找到方法,我知道我们可以从FirebaseMessagingService中获得令牌,

和以前一样,当我问问题时,文档没有更新,但现在谷歌文档更新了,因此要了解更多信息,请参考谷歌文档:FirebaseMessagingService

From: FirebaseInstanceService(已弃用)

@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}

NEW From: FirebaseMessagingService

@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.d("NEW_TOKEN",s);
}
162205 次浏览

在这里重火力点

检查FirebaseInstanceIdService的参考文档:

这个类已弃用。

支持在FirebaseMessagingService中重写onNewToken。一旦实现了该功能,就可以安全地删除该服务。

奇怪的是,FirebaseMessagingService的JavaDoc还没有提到onNewToken方法。似乎还没有发布所有更新的文档。我已经提交了一个内部问题,以更新参考文档的发布,并更新指南中的示例。

与此同时,旧的/废弃的调用和新的调用都应该工作。如果你有任何问题,张贴代码,我会看一下。

更新11-12-2020

现在< >强FirebaseInstanceId < / >强也被弃用了

现在我们需要使用FirebaseMessaging.getInstance().token

示例代码

        FirebaseMessaging.getInstance().token.addOnCompleteListener {
if(it.isComplete){
firebaseToken = it.result.toString()
Util.printLog(firebaseToken)
}
}


    

Yes FirebaseInstanceIdService不支持 . bb0 不支持

来自文档:-该类已弃用。 在FirebaseMessagingService中支持overriding onNewToken。一旦实现了该功能,就可以安全地删除该服务

不需要使用FirebaseInstanceIdService服务来获取FCM令牌。您可以安全地删除FirebaseInstanceIdService服务

现在我们需要@Override onNewTokenFirebaseMessagingService中获得Token

示例代码

public class MyFirebaseMessagingService extends FirebaseMessagingService {


@Override
public void onNewToken(String s) {
Log.e("NEW_TOKEN", s);
}


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {


Map<String, String> params = remoteMessage.getData();
JSONObject object = new JSONObject(params);
Log.e("JSON_OBJECT", object.toString());


String NOTIFICATION_CHANNEL_ID = "Nilesh_channel";


long pattern[] = {0, 1000, 500, 1000};


NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications",
NotificationManager.IMPORTANCE_HIGH);


notificationChannel.setDescription("");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(pattern);
notificationChannel.enableVibration(true);
mNotificationManager.createNotificationChannel(notificationChannel);
}


// to diaplay notification in DND Mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
channel.canBypassDnd();
}


NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);


notificationBuilder.setAutoCancel(true)
.setColor(ContextCompat.getColor(this, R.color.colorAccent))
.setContentTitle(getString(R.string.app_name))
.setContentText(remoteMessage.getNotification().getBody())
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_background)
.setAutoCancel(true);




mNotificationManager.notify(1000, notificationBuilder.build());
}
}

# 编辑

你需要像这样在manifest文件中注册你的FirebaseMessagingService

    <service
android:name=".MyFirebaseMessagingService"
android:stopWithTask="false">
<intent-filter>
            

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

#如何在您的活动中获得令牌

< >强.getToken(); < / >强也已弃用 如果你需要在你的活动中获得令牌,那么使用< >强getInstanceId () < / >强

现在我们需要使用< >强getInstanceId () < / >强来生成令牌

getInstanceId ()为这个Firebase项目返回ID和自动生成的令牌。

这将生成一个实例ID,如果它还不存在,它会定期向Firebase后端发送信息。

返回

  • 任务,你可以使用它来通过InstanceIdResult来查看结果,其中包含IDtoken

示例代码

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this,  new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);


}
});

# #编辑2

下面是kotlin的工作代码

class MyFirebaseMessagingService : FirebaseMessagingService() {


override fun onNewToken(p0: String?) {


}


override fun onMessageReceived(remoteMessage: RemoteMessage?) {




val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val NOTIFICATION_CHANNEL_ID = "Nilesh_channel"


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications", NotificationManager.IMPORTANCE_HIGH)


notificationChannel.description = "Description"
notificationChannel.enableLights(true)
notificationChannel.lightColor = Color.RED
notificationChannel.vibrationPattern = longArrayOf(0, 1000, 500, 1000)
notificationChannel.enableVibration(true)
notificationManager.createNotificationChannel(notificationChannel)
}


// to diaplay notification in DND Mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
channel.canBypassDnd()
}


val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)


notificationBuilder.setAutoCancel(true)
.setColor(ContextCompat.getColor(this, R.color.colorAccent))
.setContentTitle(getString(R.string.app_name))
.setContentText(remoteMessage!!.getNotification()!!.getBody())
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_background)
.setAutoCancel(true)




notificationManager.notify(1000, notificationBuilder.build())


}
}

这:

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()

假定为已弃用的解决方案:

FirebaseInstanceId.getInstance().getToken()

编辑

< p > FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() 可以在任务尚未完成时产生异常,所以Nilesh Rathod描述的方法(用.addOnSuccessListener)是正确的方法。< / p >

芬兰湾的科特林:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
val newToken = instanceIdResult.token
Log.e("newToken", newToken)
}

在芬兰湾的科特林:如果你想保存令牌到DB或共享首选项,那么在FirebaseMessagingService中覆盖onNewToken

override fun onNewToken(token: String) {
super.onNewToken(token)
}

在运行时获取令牌,使用

FirebaseInstanceId.getInstance().instanceId
.addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
val mToken = instanceIdResult.token
println("printing  fcm token: $mToken")
}

Kotlin允许比其他答案中显示的代码更简单的代码。

每次刷新时获取新令牌:

class MyFirebaseMessagingService: FirebaseMessagingService() {


override fun onNewToken(token: String?) {
Log.d("FMS_TOKEN", token)
}
...
}

要在运行时从任何地方获取令牌:

FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
Log.d("FMS_TOKEN", it.token)
}

FirebaseinstanceIdService已弃用。 所以必须使用“FirebaseMessagingService”

请海运图像:

enter image description here

public class MyFirebaseMessagingService extends FirebaseMessagingService {


@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.e("NEW_TOKEN",s);
}


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
}
}

FCM实现

 public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
if(data != null) {
// Do something with Token
}
}
}
// FirebaseInstanceId.getInstance().getToken();
@Override
public void onNewToken(String token) {
super.onNewToken(token);
if (!token.isEmpty()) {
Log.e("NEW_TOKEN",token);
}
}
}

并在Activity或APP中调用它的initialize:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
instanceIdResult -> {
String newToken = instanceIdResult.getToken();
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.i("FireBaseToken", "onFailure : " + e.toString());
}
});

AndroidManifest.xml:

  <service android:name="ir.hamplus.MyFirebaseMessagingService"
android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

**如果你添加了“instance_id_event”;别忘了禁用它。

你必须使用FirebaseMessagingService()而不是FirebaseInstanceIdService

在build.gradle上添加这个。 实现“com.google.firebase: firebase-messaging: 20.2.3 ' < / p >

只需调用此方法即可获得Firebase消息传递令牌

public void getFirebaseMessagingToken ( ) {
FirebaseMessaging.getInstance ().getToken ()
.addOnCompleteListener ( task -> {
if (!task.isSuccessful ()) {
//Could not get FirebaseMessagingToken
return;
}
if (null != task.getResult ()) {
//Got FirebaseMessagingToken
String firebaseMessagingToken = Objects.requireNonNull ( task.getResult () );
//Use firebaseMessagingToken further
}
} );
}

在构建中添加这个依赖后,上面的代码工作得很好。gradle文件

implementation 'com.google.firebase:firebase-messaging:21.1.0'

注意:这是对上述依赖项进行的代码修改,以解决弃用问题。(截至2021年5月9日工作代码)

使用FirebaseMessaging代替

 FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "Fetching FCM registration token failed", task.getException());
return;
}


// Get new FCM registration token
String token = task.getResult();


// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});

对于kotlin,我使用以下方法

val fcmtoken = FirebaseMessaging.getInstance().token.await()

对于扩展函数

public suspend fun <T> Task<T>.await(): T {
// fast path
if (isComplete) {
val e = exception
return if (e == null) {
if (isCanceled) {
throw CancellationException("Task $this was cancelled normally.")
} else {
@Suppress("UNCHECKED_CAST")
result as T
}
} else {
throw e
}
}


return suspendCancellableCoroutine { cont ->
addOnCompleteListener {
val e = exception
if (e == null) {
@Suppress("UNCHECKED_CAST")
if (isCanceled) cont.cancel() else cont.resume(result as T)
} else {
cont.resumeWithException(e)
}
}
}
}

getInstance().getInstanceId()现在也已弃用,现在正在使用FirebaseMessaging

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (task.isSuccessful) {
val token = task.result
} else {
Timber.e(task.exception)
}
}

下面是c# /Xamarin的解决方案。Android:

var token = await FirebaseInstallations.Instance.GetToken(forceRefresh: false).AsAsync<InstallationTokenResult>();

首先导入import com.google.firebase.messaging.FirebaseMessaging; 然后 简单地使用FirebaseMessaging.getInstance().getToken().getResult();代替FirebaseInstanceId.getInstance().getToken().getresult()

就是这样。

你可以在你的活动中使用这个方法,这对我很有用。

private void registerInBackground() {
FirebaseApp.initializeApp(SplashActivity.this);
FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
String token = task.getResult();
}
});
}

你可以使用服务

<service android:name=".utils.fcm.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>


public class MyFirebaseMessagingService extends FirebaseMessagingService{
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.e("NEW_TOKEN = = == = = =",s);
}


}

如果你想在活动中使用

FirebaseMessaging.getInstance ().getToken ().addOnCompleteListener ( task -> {
Log.e("spalsh",task.getResult());
});

com.google.firebase:firebase-bom:28.4.2中,这样做的方式是:

FirebaseMessaging.getInstance().token.result

不过,由于这是一个Task,它不会以这种方式返回值。您需要使用回调来等待它。

一个很好的解决方法是:

@WorkerThread
fun <TResult> Task<TResult>.awaitForResult(): Task<TResult> {
val countDownLatch = CountDownLatch(1)
this.addOnCompleteListener {
countDownLatch.countDown()
}
countDownLatch.await()
return this
}


@WorkerThread
fun <TResult> Task<TResult>.awaitForResultOrNull(): Task<TResult>? {
val task = awaitForResult()
return if (task.isSuccessful)
return task else null
}

举个用法的例子:

val regId : String? = FirebaseMessaging.getInstance().token.awaitForResultOrNull()?.result

新方式

FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> Log.e(TAG, "Token: "+task.getResult()));