如何通过FCM实现点击View按钮向Java聊天应用所有用户推送通知
Java应用集成FCM实现点击按钮全员推送通知方案
一、前期准备
- 开通FCM服务,下载服务账号密钥文件,存到Java后端项目的资源目录下,不要把密钥文件提交到公开代码仓库
- 客户端(Android/Java桌面端)集成对应平台的FCM客户端SDK
二、Java后端实现
- 初始化FCM SDK,这段逻辑只在项目启动时执行一次即可,不要重复初始化:
import com.google.auth.oauth2.GoogleCredentials; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import org.springframework.core.io.ClassPathResource; // 项目启动类中执行 FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream( new ClassPathResource("firebase-service-account.json").getInputStream() )) .build(); FirebaseApp.initializeApp(options);
- 配置全局主题订阅机制,这是实现全员推送最高效的方式,不要每次推送遍历所有用户token:
- 每个用户首次登录客户端、拿到FCM分配的设备token后,把token上报给后端存库,同时调用接口让该token订阅固定全局主题
all_app_users - 用户主动退出登录时,调用接口取消该设备对全局主题的订阅,避免已登出用户收到推送
- 订阅主题示例代码:
import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.TopicManagementResponse; import java.util.Arrays; // 给单个用户设备订阅全局主题 TopicManagementResponse resp = FirebaseMessaging.getInstance() .subscribeToTopic(Arrays.asList(userDeviceFcmToken), "all_app_users"); - 每个用户首次登录客户端、拿到FCM分配的设备token后,把token上报给后端存库,同时调用接口让该token订阅固定全局主题
- 编写推送触发接口,对应View按钮的点击请求:
import com.google.firebase.messaging.FirebaseMessaging; import com.google.firebase.messaging.Message; import com.google.firebase.messaging.Notification; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class NotificationController { // 接口必须加权限校验,仅允许授权角色调用,避免被恶意刷推送 @PostMapping("/api/notification/sendGlobal") public ResponseEntity<String> sendGlobalNotice() { Message pushMsg = Message.builder() .setTopic("all_app_users") // 直接向订阅了全局主题的所有设备发消息 .setNotification(Notification.builder() .setTitle("新聊天内容提醒") .setBody("点击查看最新聊天消息") .build()) // 自定义传递给客户端的参数,比如指定点击通知后跳转的页面路径 .putData("targetPage", "/chat/main") .putData("triggerType", "view_button") .build(); String msgId = FirebaseMessaging.getInstance().send(pushMsg); return ResponseEntity.ok("推送发送成功,消息ID:" + msgId); } }
- 加个定时任务,定期清理数据库里存的失效FCM token:每次推送如果返回token不存在、token无效的报错,把对应token从数据库删掉,减少无效请求。
三、客户端实现
- 首次启动时申请系统通知权限,获取FCM分配的设备注册token,上报给后端
- 注册FCM消息监听服务,不管应用在前台还是后台运行,收到消息后都能正常弹出系统通知
- 配置通知点击跳转逻辑:解析消息里携带的
targetPage参数,直接跳转到对应聊天页面,和View按钮的跳转目标保持一致 - 应用被杀死、用户主动登出时,及时取消全局主题订阅,避免无效推送
四、View按钮前端交互逻辑
- 给View按钮绑定点击事件,加防重复点击锁,避免用户连续点击触发多次推送
- 点击后先展示loading状态,调用后端的全局推送接口
- 接口返回成功后关闭loading,给操作人展示“全员通知已发送”的提示;返回失败时展示对应错误信息,支持重试
五、常见坑点说明
- 绝对不要每次发推送遍历全量用户token挨个发送:用户量过千之后很容易出现接口超时、触发FCM接口限流的问题,主题推送是FCM原生支持的全量触达能力,性能和稳定性远高于遍历发送
- 国内安卓机型需要做适配:部分厂商系统默认限制后台应用的推送权限,需要引导用户手动开启通知权限、应用自启动权限,否则会出现收不到通知的情况
- 测试阶段不要直接用全局主题发测试消息,可以先给测试设备的单独token发推送,验证通知样式、跳转逻辑都正常之后再切全量推送,避免测试消息打扰正式用户
- 通知内容不要包含违规敏感信息,FCM有内置内容审核机制,违规内容会被直接拦截导致发送失败
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

