不推荐使用FirebaseInstanceIdService


223

希望大家都知道这个类,用于在刷新Firebase通知令牌时获取通知令牌,我们从此类中从以下方法获取刷新的令牌。

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

为了在我要实现FCM时使用它,我从扩展了MyClass。 FirebaseInstanceIdService

但是,表明FirebaseInstanceIdService已过时

有人知道吗?,不推荐使用什么方法或类代替刷新令牌。

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

我检查了文档是否相同,对此没有提及。:FCM设置文件


更新

这个问题已被解决。

随着Google弃用FirebaseInstanceService

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

和以前一样,当我问问题文档未更新但现在Google文档已更新以便获取更多信息时,请参阅此google文档:FirebaseMessagingService

OLD从:FirebaseInstanceService(已弃用)

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

来自:FirebaseMessagingService

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

谢谢。





打电话是必要/正确的super.onNewToken(s);吗?(我没有看到它被称为上firebase.google.com/docs/cloud-messaging/android/client
禁令-地球工程

舱单会有所变化吗?
Muahmmad Tayyib

Answers:


122

在这里放火

查看参考文档中的内容FirebaseInstanceIdService

此类已弃用。

赞成onNewTokenFirebaseMessagingService。一旦实施,就可以安全地删除此服务。

奇怪的是JavaDoc FirebaseMessagingService尚未提及该onNewToken方法。似乎尚未发布所有更新的文档。我提出了一个内部问题,以获取对参考文档的更新,并也对指南中的示例进行了更新。

同时,旧的/已弃用的呼叫和新的呼叫均应工作。如果您遇到任何麻烦,请发布代码,然后看看。



1
是@frank,该方法确实存在,但是相关文档尚未更新。
乌塔姆·潘恰萨拉

@kev听起来像是一个(有效)新问题。请创建一个新帖子,并使用最少的完整代码段。
弗兰克·范·普菲伦

@FrankvanPuffelen已经做到了。看一看。stackoverflow.com/questions/51296171/…–
kev

1
我也找到了有关Xamarin Android的此更新。在扩展FirebaseMessagingService的类中添加了OnNewToken方法。但是这种方法没有成功。我不知道该怎么办。xamarin的Android清单文件中是否有所不同。
Prabesh

133

是, FirebaseInstanceIdService已弃用

FROM DOCS:- 不推荐使用该类。赞成overriding onNewTokenin FirebaseMessagingService。一旦实施,就可以安全地删除此服务。

无需使用FirebaseInstanceIdService服务即可获取FCM令牌您可以安全地删除FirebaseInstanceIdService服务

现在,我们需要@Override onNewToken 得到TokenFirebaseMessagingService

样本代码

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());
    }
}

编辑

您需要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 () 返回 ID为此Firebase项目自动生成的令牌。

如果实例ID不存在,则会生成一个实例ID,并开始定期向Firebase后端发送信息。

退货

  • 您可以通过InstanceIdResult包含ID和的任务查看结果token

样本代码

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())

    }
}

1
评论不作进一步讨论;此对话已转移至聊天
塞缪尔·柳

为什么没有人显示如何导入FirebaseMessagingService?
temirbek

12

还有这个:

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

假设是不建议使用的解决方案:

FirebaseInstanceId.getInstance().getToken()

编辑

FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken() 如果任务尚未完成,则可能会产生异常,因此Nitchsh Rathod(用.addOnSuccessListener)描述的方法是正确的方法。

科特林:

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

5

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

要在刷新时获取新令牌:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

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

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

5

FirebaseinstanceIdService不推荐使用。因此必须使用“ FirebaseMessagingService”

请海图:

在此处输入图片说明

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);
    }
}

4

在KOTLIN中:-如果要将令牌保存到数据库或共享首选项中,请在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")
                        }

现在是override fun onNewToken(token: String)(没有问号)。
卡萨托·托斯

1

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中调用其初始化:

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”,则不要忘记禁用它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.