不推荐使用FirebaseInstanceIdService

时间:2018-07-01 12:12:41

标签: android firebase firebase-cloud-messaging

希望大家都知道这个类,用于在刷新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 SETUP DOCUMENT


更新

此问题已得到解决。

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

谢谢。

15 个答案:

答案 0 :(得分:101)

Yes FirebaseInstanceIdService is deprecated

  

FROM DOCS:-已弃用该类。   赞成overriding onNewToken中的FirebaseMessagingService。一旦实施,就可以安全地删除此服务。

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

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

示例代码

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(如果尚不存在),并开始定期向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())

    }
}

答案 1 :(得分:80)

firebaser here

检查reference documentation for FirebaseInstanceIdService

  

不推荐使用此类。

     

赞成在<!DOCTYPE html> <html> <head> <title>soccertime</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="timeit" data-start="2018-7-1 14:00" data-end="2018-7-1 15:01"> <div class="time">TV2 - 14:00</div> <div class="teams">Spanien - Rusland</div> <div class="league">FIFA World Cup 2018 - 1/8 finale</div> </div> <div class="timeit" data-start="2018-7-1 14:35" data-end="2018-7-1 16:00"> <div class="time">Youtube - 17:35</div> <div class="teams">SK Sturm Graz - F.C. København</div> <div class="league">Træningskamp</div> </div> <div class="timeit" data-start="2018-7-1 17:35" data-end="2018-7-1 19:00"> <div class="time">DR1 - 19:00</div> <div class="teams">Kroatien - Danmark</div> <div class="league">FIFA World Cup 2018 - 1/8 finale</div> </div> <div class="timeit" data-start="2018-7-1 22:50" data-end="2018-7-2 01:00"> <div class="time">Eurosport2 - 19:00</div> <div class="teams">Toronto FC - New York Red Bulls</div> <div class="league">Major League Soccer</div> </div> <script type="text/javascript" src="jQuery.js"></script> <script type="text/javascript" src="timeit.js"></script> </body> </html>中覆盖onNewToken。一旦实施,就可以安全地删除此服务。

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

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

答案 2 :(得分:9)

这:

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

假定是不推荐使用的解决方案:

FirebaseInstanceId.getInstance().getToken()

编辑

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

科特琳:

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

答案 3 :(得分:7)

只需调用此方法即可获取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
                    }
                } );
    }

在build.gradle文件中添加此依赖项后,上述代码运行良好

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

注意:这是为解决上述依赖性而对上述依赖项进行的代码修改。 (截至2020年11月1日的工作代码)

答案 4 :(得分:2)

在KOTLIN中:-:如果要将令牌保存到数据库或共享首选项中,请在image

中覆盖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")
                        }

答案 5 :(得分:2)

Kotlin所提供的代码比其他答案中显示的更为简单。

要在刷新时获取新令牌:

class MyFirebaseMessagingService: FirebaseMessagingService() {

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

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

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

这里是 C#/Xamarin.Android 的解决方案:

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

答案 8 :(得分:0)

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”,则别忘了禁用它。

答案 9 :(得分:0)

只需在build.gradle上添加它即可。 实施'com.google.firebase:firebase-messaging:20.2.3'

答案 10 :(得分:0)

改为使用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();
        }
    });

答案 11 :(得分:0)

对于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)
            }
        }
    }
}

答案 12 :(得分:0)

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

FirebaseInstallations.getInstance().getToken(forceRefresh: false).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val token = task.result.token
        // do stuff with token
    } else {
        showAlert(R.string.token, R.string.error_fetching_token, null)
    }
}

答案 13 :(得分:0)

首先导入 import com.google.firebase.messaging.FirebaseMessaging; 然后 只需使用 FirebaseMessaging.getInstance().getToken().getResult(); 而不是 FirebaseInstanceId.getInstance().getToken().getresult()

就是这样。

答案 14 :(得分:-1)

def __init__(self, *args, **kwargs): self.cuestionario = kwargs.pop('cuestionario', False) super(PreguntaForm, self).__init__(*args, **kwargs) self.fields['grupo'].queryset = Grupo.objects.filter(cuestionario=self.cuestionario) def clean(self): # do something with self.cuestionario 已过时。 因此必须使用“ FirebaseMessagingService”

请海图片:

enter image description here

implementation 'com.google.firebase:firebase-auth:16.0.1' //delete 15.0.0