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
相关产品推荐
相关产品推荐

