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

如何通过FCM实现点击View按钮向Java聊天应用所有用户推送通知

Java应用集成FCM实现点击按钮全员推送通知方案

一、前期准备

  • 开通FCM服务,下载服务账号密钥文件,存到Java后端项目的资源目录下,不要把密钥文件提交到公开代码仓库
  • 客户端(Android/Java桌面端)集成对应平台的FCM客户端SDK

二、Java后端实现

  1. 初始化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);
  1. 配置全局主题订阅机制,这是实现全员推送最高效的方式,不要每次推送遍历所有用户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");
    
  2. 编写推送触发接口,对应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);
    }
}
  1. 加个定时任务,定期清理数据库里存的失效FCM token:每次推送如果返回token不存在、token无效的报错,把对应token从数据库删掉,减少无效请求。

三、客户端实现

  • 首次启动时申请系统通知权限,获取FCM分配的设备注册token,上报给后端
  • 注册FCM消息监听服务,不管应用在前台还是后台运行,收到消息后都能正常弹出系统通知
  • 配置通知点击跳转逻辑:解析消息里携带的targetPage参数,直接跳转到对应聊天页面,和View按钮的跳转目标保持一致
  • 应用被杀死、用户主动登出时,及时取消全局主题订阅,避免无效推送

四、View按钮前端交互逻辑

  • 给View按钮绑定点击事件,加防重复点击锁,避免用户连续点击触发多次推送
  • 点击后先展示loading状态,调用后端的全局推送接口
  • 接口返回成功后关闭loading,给操作人展示“全员通知已发送”的提示;返回失败时展示对应错误信息,支持重试

五、常见坑点说明

  • 绝对不要每次发推送遍历全量用户token挨个发送:用户量过千之后很容易出现接口超时、触发FCM接口限流的问题,主题推送是FCM原生支持的全量触达能力,性能和稳定性远高于遍历发送
  • 国内安卓机型需要做适配:部分厂商系统默认限制后台应用的推送权限,需要引导用户手动开启通知权限、应用自启动权限,否则会出现收不到通知的情况
  • 测试阶段不要直接用全局主题发测试消息,可以先给测试设备的单独token发推送,验证通知样式、跳转逻辑都正常之后再切全量推送,避免测试消息打扰正式用户
  • 通知内容不要包含违规敏感信息,FCM有内置内容审核机制,违规内容会被直接拦截导致发送失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:09:23