Kotlin中FCM推送特定用户遇INVALID_KEY错误及定向推送问题
Firebase FCM推送问题排查与解决方案
一、解决401 INVALID_KEY错误
出现401错误是因为请求授权密钥无效,按以下步骤排查:
- 确认Server Key正确性:登录Firebase控制台,进入项目设置→云消息传递,复制「服务器密钥」(不要使用旧版Legacy Server Key),将代码中
$key替换为该密钥,确保无空格、换行或多余字符。 - 检查请求头格式:Authorization头必须严格遵循
key=你的Server Key格式,不能添加额外空格或符号。 - 验证项目匹配性:确保Server Key所属的Firebase项目,与当前应用的包名、SHA-1签名完全匹配,否则密钥会被判定无效。
- 建议后端发送推送:FCM官方不推荐在客户端直接发送推送请求,存在密钥泄露风险,若坚持客户端发送,需确保密钥未被反编译泄露。
二、实现向特定用户推送
当前代码仅能向自身推送,要实现特定用户推送需完成以下流程:
- 存储用户令牌到后端
在MyFirebaseMessagingService的onNewToken方法中,将新生成的令牌上传到后端数据库,与用户ID绑定存储:override fun onNewToken(token: String) { super.onNewToken(token) // 调用后端接口,将token与当前登录用户ID关联存入数据库 // 示例:api.updateUserToken(userId, token) } - 获取目标用户令牌
当需要发送推送时(比如用户发布评论后),从后端数据库根据目标用户的ID查询对应的FCM令牌,而非获取当前用户的令牌。 - 调用推送函数发送
将查询到的目标用户令牌传入sendPushNotification函数:// 假设已从后端获取到目标用户的token:targetUserToken sendPushNotification(targetUserToken, "오늘도청춘", description.toString()) - 维护令牌有效性
定期清理数据库中无效的令牌(比如用户卸载应用后,FCM会返回InvalidRegistration错误),同时在onNewToken中及时更新用户的令牌,避免因令牌过期导致推送失败。
补充代码优化建议
- 在
sendPushNotification中添加令牌非空判断,避免空令牌导致请求失败:fun sendPushNotification(token: String?, title: String, body: String) { token ?: run { Log.d("푸시", "토큰이 비어있습니다") return } // 剩余原有代码... } - 通知构建时添加点击跳转逻辑,提升用户体验:
// 创建跳转Intent val intent = Intent(this, TargetActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE) builder.setContentTitle(title) .setContentText(body) .setSmallIcon(R.drawable.ic_illustimage) .setContentIntent(pendingIntent) // 添加点击跳转 .setAutoCancel(true) // 点击后自动取消通知
内容的提问来源于stack exchange,提问作者Hyejung
相关产品推荐
相关产品推荐

