You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase FCM返回InvalidRegistration错误的原因及解决方法

FCM推送返回InvalidRegistration错误的原因与解决办法

用于发送FCM推送的Kotlin函数

private fun sendNotificationToUser(boardName: String, token: String): String {
        var result: String

        var connection: HttpURLConnection? = null
        try {
            val url = URL(Constants.FCM_BASE_URL)
            connection = url.openConnection() as HttpURLConnection

            connection.doOutput = true
            connection.doInput = true
            connection.instanceFollowRedirects = false
            connection.requestMethod = "POST"
            connection.setRequestProperty("Content-Type", "application/json")
            connection.setRequestProperty("charset", "utf-8")
            connection.setRequestProperty("Accept", "application/json")
            connection.setRequestProperty(Constants.FCM_AUTHORIZATION, "${Constants.FCM_KEY}=${Constants.FCM_SERVER_KEY}")
            connection.useCaches = false

            val wr = DataOutputStream(connection.outputStream)

            val jsonRequest = JSONObject()
            val dataObject = JSONObject()
            dataObject.put(Constants.FCM_KEY_TITLE, "Assigned to the Board $boardName")
            dataObject.put(Constants.FCM_KEY_MESSAGE, "You have been assigned to the new board by ${mAssignedMembersList[0].name}")

            jsonRequest.put(Constants.FCM_KEY_DATA, dataObject)
            jsonRequest.put(Constants.FCM_KEY_TO, token)

            wr.writeBytes(jsonRequest.toString())
            wr.flush()
            wr.close()

            val httpResult: Int =
                connection.responseCode

            if (httpResult == HttpURLConnection.HTTP_OK) {

                val inputStream = connection.inputStream
                val reader = BufferedReader(InputStreamReader(inputStream))
                val sb = StringBuilder()
                var line: String?
                try {
                    while (reader.readLine().also { line = it } != null) {
                        sb.append(line + "\n")
                    }
                } catch (e: IOException) {
                    e.printStackTrace()
                } finally {
                    try {
                        inputStream.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }
                }
                result = sb.toString()
            } else {
                result = connection.responseMessage
            }

        } catch (e: SocketTimeoutException) {
            result = "Connection Timeout"
        } catch (e: Exception) {
            result = "Error : " + e.message
        } finally {
            connection?.disconnect()
        }

        return result
    }

FCM返回结果

{"multicast_id":4389386151184574869,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

错误原因及解决办法

  • 设备令牌格式无效
    传入的token存在格式问题,比如包含空格、多余字符,或者长度不符合FCM令牌要求。FCM设备令牌是一串无空格的长字符串,可能在传递过程中被截断、拼接错误。
    解决办法:直接从客户端获取原始令牌,复制到测试环境验证,确保服务端收到的令牌和客户端获取的完全一致。

  • 令牌已过期或失效
    用户卸载应用、清除应用数据、设备系统更新,或者切换账号、重新安装应用,都会导致原FCM令牌失效。
    解决办法:客户端监听令牌更新事件,令牌变化时主动同步到服务端替换旧令牌;服务端收到InvalidRegistration错误后,标记该令牌为无效,后续不再使用。

  • 令牌与项目不匹配
    客户端获取令牌用的Firebase项目配置(如google-services.json),和服务端发送请求用的FCM_SERVER_KEY所属项目不一致。
    解决办法:核对客户端配置文件和服务端密钥对应的项目ID,确保两者属于同一个Firebase项目。

  • 混淆了令牌类型
    比如把APNs令牌当成FCM令牌传入,或者混用了Android、iOS平台的令牌格式。
    解决办法:区分不同平台的令牌,确保服务端发送时使用对应平台的有效FCM令牌。

  • 请求参数设置错误
    检查请求JSON里的to字段是否正确赋值,有没有拼写错误(比如写成token而非to),或者令牌被包裹在错误的JSON结构中。
    解决办法:打印发送的完整JSON请求内容,确认to字段的值就是正确的设备令牌,格式无误。

内容的提问来源于stack exchange,提问作者Aditya Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:17:48