FirebaseInstanceIdService已经被弃用。

293

希望大家都知道这个类,它用于在 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 配置文档 更新:
此问题已得到解决。
由于 Google 弃用了 FirebaseInstanceService,我问了这个问题以找到方法,我知道我们可以从 FirebaseMessagingService 中获取 Token,
之前,当我提出这个问题时,文档没有更新,但现在 Google 文档已经更新,所以更多信息,请参阅此 Google 文档:FirebaseMessagingService 旧的: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);
}

1
GitHub 上进行了交叉发布。 - Rosário Pereira Fernandes
需要/正确调用super.onNewToken(s);吗?(我在https://firebase.google.com/docs/cloud-messaging/android/client上没有看到它被调用。) - ban-geoengineering
清单文件会有任何更改吗? - Muahmmad Tayyib
1
你只需要在清单文件中不再定义FirebaseInstanceService,因为它已经被弃用。 - Uttam Panchasara
2
谢谢。Android Studio需要更新Firebase设置向导中的说明。 - John Gorenfeld
显示剩余3条评论
19个回答

1
你可以使用服务。
<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);
    }

}

如果您想在Activity中使用
FirebaseMessaging.getInstance ().getToken ().addOnCompleteListener ( task -> {
                Log.e("spalsh",task.getResult());
                    });

1

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

就是这样。


1

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

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

forceRefresh是什么?每次打开活动时刷新令牌吗? - Abhishek AN
@AbhishekAN 是的,它会强制获取一个新的令牌。 - OhhhThatVarun
1
嗨,我应该使用 FirebaseInstallations 还是 FirebaseMessaging? - Тони

0

com.google.firebase:firebase-bom:28.4.2 开始,做法如下:

FirebaseMessaging.getInstance().token.result

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

解决它的一种好方法是通过这种方式:

@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

0

新的方式

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

0

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

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

0

只需在 build.gradle 中添加以下内容。 implementation 'com.google.firebase:firebase-messaging:20.2.3'


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

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

Task<T>.await() 可从 https://github.com/Kotlin/kotlinx.coroutines/tree/master/integration/kotlinx-coroutines-play-services 获取,只需将 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.4.2' 添加到您的 gradle 中即可。 - SqAR.org

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接