Firebase Cloud Messaging(FCM)是 Firebase 提供的一项跨平台消息传递服务,用于向移动设备、Web 应用程序和服务器发送消息和通知。它为开发者提供了一种简单而强大的方式,可以轻松地向用户推送即时通知、消息和数据,从而增强应用的用户体验和参与度。
以下是 Firebase Cloud Messaging 的主要特点和功能:
-
跨平台支持: FCM 可以发送消息和通知到 Android、iOS、Web 应用程序和其他移动和 Web 客户端。
-
消息类型: FCM 支持发送不同类型的消息,包括通知消息(通知栏消息)、数据消息(仅携带数据,不显示通知)、数据/通知混合消息等。
-
高效的传输: FCM 提供了高效的消息传输通道,确保消息可以快速地传送到目标设备,无论是通过移动网络还是 Wi-Fi。
-
目标定位: 开发者可以通过各种方式指定消息的接收者,包括单个设备、设备群组、主题订阅等,以便将消息发送给特定的目标用户。
-
消息分析: FCM 提供了丰富的消息分析功能,可以帮助开发者了解消息的发送情况、接收情况和用户行为,以便优化消息推送策略。
-
可配置性: 开发者可以在 Firebase 控制台或通过 API 对消息进行灵活的配置和定制,包括消息内容、优先级、过期时间、消息标签等。
-
与其他 Firebase 服务集成: FCM 可以与其他 Firebase 服务集成,如实时数据库、云存储、身份认证等,为开发者提供更多的功能和服务。
总的来说,Firebase Cloud Messaging 是一项功能强大、易于使用的消息传递服务,为开发者提供了一种简单而可靠的方式,用于向移动设备和 Web 应用程序发送通知、消息和数据,从而提高应用的用户参与度和体验。
1、需要在https://console.firebase.google.com/完成项目的创建,以及获取相关配置文件比如服务账户密钥FirebaseFile.json文件
2、引用Maven依赖
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-admin</artifactId>
<version>9.2.0</version>
</dependency>
3、FCMMessageSender发送消息实现类(Java后端代码,Web端代码需要前端同学单独实现)
/**
* @author Lucas
* date 2024/4/16 12:48
* description 谷歌发送消息
*/
@Slf4j
@Component
public class FCMMessageSender {
// 初始化 FirebaseApp
static {
try {
//获取resources下Firebase服务账户密钥FirebaseFile.json文件
InputStream inputStream = ResourceUtil.getStream("FirebaseFile.json");
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(inputStream))
.build();
FirebaseApp.initializeApp(options);
} catch (Exception e) {
log.error("Error initializing FirebaseApp: " + e.getMessage());
}
}
/**
* 向指定设备发送消息
* @param deviceToken 接收方设备注册令牌Token
* @param title 标题
* @param messageBody 内容
*/
public void sendToOne(String deviceToken, String title, String messageBody) {
// 构建消息体
Message message = Message.builder()
.setToken(deviceToken)
.setNotification(Notification.builder()
.setTitle(title)
.setBody(messageBody)
.build())
.setAndroidConfig(AndroidConfig.builder()
.setPriority(AndroidConfig.Priority.HIGH)
.setNotification(AndroidNotification.builder()
.setSound("default")
.build())
.build())
.build();
// 发送消息
try {
String response = FirebaseMessaging.getInstance().send(message);
log.info("Successfully sent message: " + response);
} catch (Exception e) {
log.error("Error sending message: " + e.getMessage());
}
}
/**
* 设备订阅主题
* @param topicName 订阅的主题名称
* @param clientToken 订阅主题的接收方设备注册令牌Token
*/
public void subscribeToTopic(String topicName, String clientToken) {
// 执行订阅请求
try {
TopicManagementResponse response = FirebaseMessaging.getInstance().subscribeToTopic(Arrays.asList(clientToken), topicName);
log.info("Successfully subscribed to topic: " + response.getSuccessCount() + " devices.");
} catch (Exception e) {
log.error("Error subscribing to topic: " + e.getMessage());
}
}
/**
* 向订阅的主题发送消息
* @param topicName 订阅的主题名称
* @param title 标题
* @param messageBody 内容
* @param icon 图标
* @param image 图片
* @param openPage 打开页面
*/
public void sendToTopic(String topicName, String title, String messageBody, String icon, String image, String openPage) {
// 构建消息体
Message message = Message.builder()
.setNotification(Notification.builder()
.setTitle(title)
.setBody(messageBody)
.setImage(image)
.build())
.putData("icon", StrUtil.isNotBlank(icon) ? icon : "")
.putData("openPage", StrUtil.isNotBlank(openPage) ? openPage : "")
.setTopic(topicName)
.build();
// 发送消息
try {
String response = FirebaseMessaging.getInstance().send(message);
log.info("Successfully sent message to topic: " + response);
} catch (Exception e) {
log.error("Error sending message to topic: " + e.getMessage());
}
}
}