首页 > 解决方案 > 如何在获取令牌时修复firebase云消息传递中的SERVICE_NOT_AVAILABLE错误

问题描述

我正在尝试获取 fcm 令牌并将其存储在云 Firestore 中:

val user = User(et_email_sign_up_activity.text.toString(), et_name_sign_up_activity.text.toString(),
                            et_mobile_sign_up_activity.text.toString(), "",
                        FirebaseAuth.getInstance().currentUser?.uid!!, tv_address.text!!.toString(), getToken())
                    Firebase().uploadUserSignIn(user, this)//uploads user to cloud firestore

获取令牌():

private fun getToken(): String{
        var token = ""
        FirebaseMessaging.getInstance().token.addOnSuccessListener {
            token = it
            Log.i("token", it)
        }.addOnFailureListener {
            val dialog = AlertDialog.Builder(this)
            dialog.setMessage(it.toString())
            dialog.show()
        }
        return token
    }

每当我尝试在真正的 android 设备中执行我的代码时,我总是会收到此错误:

E/FirebaseMessaging: Topic sync or token retrieval failed on hard
failure exceptions: java.util.concurrent.ExecutionException:
java.io.IOException: SERVICE_NOT_AVAILABLE. Won't retry the operation.

我有运行正确的互联网连接的谷歌播放服务

我尝试过的几个解决方案:

  1. 在清单中添加互联网权限:
  2. 输入sha1和sha256后从firebase下载google.json文件
  3. 在谷歌云中启用安卓设备验证。

有时我没有收到错误,并且 fcm 令牌成功返回,但大多数时候我收到此错误。

错误是什么?

标签: androidfirebasefirebase-cloud-messaging

解决方案


即使我面临同样的问题,当您的设备由于某种原因无法与 FCM 通信时,也会出现此问题。您可以执行以下检查以使其正常工作:

  1. 检查您与设备的互联网连接
  2. 在移动数据和 wifi 之间切换,反之亦然
  3. 设备日期时间应该是正确的。
  4. 尝试清理缓存。
  5. 杀死应用程序并重新启动它。

推荐阅读