1.FCM简介:
Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案,可供您可靠地传递消息,而且还是免费的服务。支持 Android,IOS,Web,Flutter,Unity.
消息类型
通知消息包含一组用户可见的预定义键。与其相对,数据消息只包含用户定义的自定义键值对。通知消息可以包含可选的数据载荷。两种消息类型的载荷上限均为 4000 个字节,但从 Firebase 控制台发送消息时会强制执行 1024 个字符的限制。
使用情景 |
||
通知消息 |
当客户端应用在后台运行时,FCM SDK 会代表客户端应用向最终用户设备显示消息。如果应用在收到通知时正在前台运行,应用的代码会决定行为。通知消息包含一组预定义的用户可见的键和一个由自定义键值对组成的可选的数据载荷。 |
|
数据消息 |
在可信环境(例如 Cloud Functions 或应用服务器中),使用 Admin SDK 或者 FCM 服务器协议:仅设置 data 键。 |
通知消息
如果要进行测试,或者要开展营销、重新吸引用户,可以使用 Firebase 控制台发送通知消息。Firebase 控制台提供基于分析的 A/B 测试,可帮助优化和改进营销消息。
如需使用 Admin SDK 或 FCM 协议以编程方式发送通知消息,可使用通知消息中用户可见部分所必需的预定义键值对选项集来设置 notification 键。例如,以下是即时通讯应用中的 JSON 格式的通知消息。用户可能会在设备上看到标题为“Portugal vs. Denmark”、文本为“great match!”的消息:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}
}
应用在后台运行时,通知消息将被传递至通知面板。应用在前台运行时,消息由回调函数处理。
数据消息
使用自定义键值对设置适当的键,以将数据载荷发送至客户端应用。
请确保未在自定义键值对中使用任何保留字词。保留字词包括“from”“notification”“message_type”或以“google”或“gcm”开头的任何字词。
例如,下方所示为上述同一即时通讯应用中的一条 JSON 格式的消息,在此消息中,信息封装在常用的 data 键中,且客户端应用需要解读相应内容:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
2.FCM 架构概览:
通过上图架构可以看到可以发送FCM的平台:
1:开发中常用的:项目服务端server端接入Firebase Admin SDK
2.客户端可以直接发送FCM
3.生命周期流:
-
发送和接收下行消息。
-
发送消息。应用服务器向客户端应用发送消息:
4.客户端接入:
第 1 步:创建 Firebase 项目
需要先创建一个要关联到 Android 应用的 Firebase 项目,然后才能将 Firebase 添加到 Android 应用。请访问了解 Firebase 项目以了解详情。
创建项目:https://console.firebase.google.com/?hl=zh-cn
第 2 步:在 Firebase 中注册您的应用
如需在 Android 应用中使用 Firebase,需要向 Firebase 项目注册的应用。注册应用的过程通常称为将应用“添加”到项目中。
第 3 步:添加 Firebase 配置文件
{
"project_info": {
"project_number": "200570714500",
"project_id": "testproject-82da6",
"storage_bucket": "testproject-82da6.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:200570714500:android:31bd6c1683be9fb6a485d1",
"android_client_info": {
"package_name": "com.test.project.android"
}
},
"oauth_client": [
{
"client_id": "200570714500-g7s70nmqogiviequmsegmuo49kf8knnb.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.test.project.android",
"certificate_hash": "b0bd34f3447d5d63bf620ae01a5bb494759ee845"
}
},
{
"client_id": "200570714500-b9i97kadm6me2b2hb9e7l3cmsop63ajk.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBys0WVyFocO8ulfPdqIWMKCPWvy1HlppY"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "200570714500-b9i97kadm6me2b2hb9e7l3cmsop63ajk.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
放到项目中的位置:放到项目的./app 目录下即可,如果要区分debug or release 那就可以根据多渠道创建对应的文件夹下:
第 4 步:将 Firebase SDK 添加到应用中
buildscript {
repositories {
// Make sure that you have the following two repositories
google() // Google's Maven repository
mavenCentral() // Maven Central repository
}
dependencies {
...
// Add the dependency for the Google services Gradle plugin
classpath 'com.google.gms:google-services:4.3.15'
}
}
allprojects {
...
repositories {
// Make sure that you have the following two repositories
google() // Google's Maven repository
mavenCentral() // Maven Central repository
}
}
dependencies {
implementation platform('com.google.firebase:firebase-bom:31.2.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-auth'
implementation 'com.google.firebase:firebase-firestore'
implementation 'com.google.firebase:firebase-messaging'
}
plugins {
id 'com.android.application'
// Add the Google services Gradle plugin
id 'com.google.gms.google-services'
...
}
5. FCM项目中使用:
5.1 首先创建一个类继承FirebaseMessagingService ,实现onMessageReceived()和 onNewToken()方法
class MessagingService : FirebaseMessagingService(), LifecycleObserver {
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
override fun onMessageReceived(remoteMessage: RemoteMessage) {
if (remoteMessage == null) {
return
}
val remoteMessageMap: Map<String, String> = remoteMessage.data;
if (remoteMessageMap == null || remoteMessageMap.isEmpty()) {
return
}
val json = JSON.toJSON(remoteMessageMap) as JSONObject
}
override fun onNewToken(token: String) {
try {
MyApplication.instance?.let {
ApiClient.getApiService(it.sessionManager).postPushToken(PushTokenBody(token))
}
val param = HashMap<String, Any>()
param.put("fcm_registration_token", token)
AppLog.setHeaderInfo(param)
} catch (e: java.lang.Exception) {
}
}
}
onMessageReceived()是监听推送的消息,onNewToken()是当有新的Firebase token 时的回调,有新的 token 及时上传server
由于FirebaseMessagingService 是一个 service 所以要在AndroidManifest中声明:
<service
android:name=".ui.notification.MessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
5.2 启动APP时 获取firebase fcm token 上传server
初次启动APP时,FCM SDK 会为客户端应用实例生成一个注册令牌 (registration token),注意上面睡到 FirebaseMessagingService 并重写 onNewToken 来获取更新此token。
-
应用在新设备上恢复
-
用户清除应用数据。
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w(TAG, "Fetching FCM registration token failed", task.exception)
return@OnCompleteListener
}
// Get new FCM registration token
val token = task.result
// Log and toast
val msg = getString(R.string.msg_token_fmt, token)
Log.d(TAG, msg)
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "Fetching FCM registration token failed", task.getException());
return;
}
// Get new FCM registration token
String token = task.getResult();
// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
6.使用 Firebase 控制台发送消息进行测试
可以使用 Firebase 控制台中的 Notifications Composer 发送通知消息。尽管使用这种方法发送消息的灵活性或可伸缩性不及使用 Admin SDK 或 HTTP 和 XMPP 协议,但它非常适合用于测试或者针对性较强的营销活动及用户互动。Firebase 控制台提供基于分析结果的 A/B Testing 测试,可帮助优化和改进营销消息。
从 Notifications Composer 发送通知消息时,Google 以如下方式使用您在表单字段中输入的值:
这些字段会映射至使用 Message 对象时可用的键。例如,在编辑器的自定义数据字段中输入的键值对是作为通知的 data 载荷处理的。其他字段直接映射至 notification 对象或平台专用通知配置中的键。
请注意,Notifications Composer 中的某些字段在使用 FCM API 时不可用。例如,您可以根据应用版本、语言、浏览器类型、浏览器版本或用户属性来定位细分用户群,而这些方法均无法通过服务器 API 来使用。
Firebase 控制台向客户端发送的键有:
决定消息传送方式的键包括:
这样通过控制台发送的消息推送,APP的onMessageReceived()就能接收到该消息
这个时候当APP杀死或者切后台时,FCM SDK会直接走系统的notificaion.如果这个时候APP在activity status 收到push message 后就可以做独立的逻辑了
7.使用 Firebase Admin SDK for FCM发送消息
Admin FCM API 可处理后端身份验证工作,同时便于发送消息和管理主题订阅。使用 Firebase Admin SDK,可以执行以下操作:
-
向单个设备发送消息
Admin Node.js SDK 提供了用于向设备组发送消息的方法。
使用Firebase Admin SDK 需要从Firebase 控制台获取json:
{
"type": "service_account",
"project_id": "testproject-82da6",
"private_key_id": "2dab734ab58df4f1b0898cde1e8c8b488ae3134d",
"private_key": "-----BEGIN PRIVATE KEY-----nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCy3HNgzSSUTG8rny7CulZZr7CdW70UEfL6dbla1b9lmxdIDWmMz+/8tux8dSr7FKjvUhHjqF5R8Ua7bnCySuvvwjhwHm9u9kC1bOmlOhzMMsfRCQqIFU5nPvq+6KIrELwrIk6wpwXof4+6nsnUhPrOv3AyEi1+yeTlXipexsaQ1X45qPfCvAJea59DpbnObhtX0g5K5tp6IqwaXwgncXoUgTeQlkjG3f3Y5A/wNH2etAqzA299ixUyl/20hHyOY8wtTNj67ZgsW4bvufXFn8+y2vm4i2eIgV1uvHpPRBHcH5lV8PJH8Pgd3n9dXDSuKDaq/zc87DbPC9ybSovLAnkTnzUZWDAgMBAAECggEAVhz/S87Y2rGGIL7b3OJWXrV/J0LhpsxsdZ2HD6m/MNTznTPv6oS+lZx4dV9wBxymTTrlNAd/CdKxbFEjkK2H2QSCiENI45aDz9VqmA1NzcHrynO8N1KSwfC3hqy4TyWqgtXsru5rUMoBqCcC4AOxPW0jdbkopOPqcLRgXoQZfDz6ZknhK2QhaIVbw2sHZZsCNYagRI+7AlS6VDT9FnREj5HoeyNFiNCT6th7Am6mi040mI1nJaAJ2OhvNyW4vQpaLjT8Dadgw4uU3yLt+0wKtQJU83qNtgyiXnCNp4En7c+d/f0AnrovZVpvA5LpVzokq+9nNTtrVEB1BmuxAyZnV/6I+eQKBgQDtCX791LezaSHAuIgLnTlwQjCnd4nz+X2kYAACdfJMRHVuV2JcyHrV0Z+ICMX/hlqlyO9sP0Rs4gAfBtX2anerWzjT0OfhhJaTULY7nO/sXBNpsb/4LM4Ac6WN+gqL20Qp7ekExs5/cUoWjhsEQKno+tauuMvAhGSG/Kz1ALa+5DmtQKBgQDBK4POi9+w9h+/FvlzKl6/1RSg1HAf3DyOnsih+1dcb/YkptFH460tns3zq9AZBX3DAQPjb0yL8uEfdRBVtnCwEASVbujgKYZz+ntsBkR6ZsPrBVsFP5bwvT6k7ioZgoQiriNwQkxrUa4Z9NdD/bWB6liEUp1f86vD03noZ/bw2U2VwKBgCTvad5bmxRVuXCyUGCSoT3i2VM9y4RHkbSvq2je1HvCO1cqHMUuni8/LsCfvVqHsPBMUyJm6V6eCK7M/eIbtwApuY6kydM5bmmxf6cAbau0keR7vvY33nCqlI1+/M22KPTvoXOhFuQ83vKMyiDrgpuq60mFnm1J4TxMnIq3k74eRRAoGBAKeHnm8qYWKpa6vGJdVJCHuZ0YG2TkKKxGPwQ2zoVL3ghDMJUlvsw5bbMXbxPYtVzdo/mnSW4s0R0onXryvzrOxQW8ELBa8pteSRBHYtgVo+og/EF0qX+cpT9m6H948kOIDzUdnzcQvaYYkw0ojVfZfmESryIAeDjrcYqNK0x9/eNoFAoGBAJZ8+h0Fi0bonctG7TwCnR0rRX04l1VeOnMLhlgXZp5z4lzl7Bpuuua2yJHRnuJyN46hUxv8aNNKYeQbv8tTDnGbCxJnSmL636aYwPIBYylU74CjIoUmcC2ce7MoT7c9zXaZvEmhSWEyzHTDXTJwL4nhbAsd2wwEC0PJuU/Ri3rfk+Xn-----END PRIVATE KEY-----n",
"client_email": "firebase-adminsdk-62mnh@testproject-82da6.iam.gserviceaccount.com",
"client_id": "114249923120443166527",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-62mnh%40testproject-82da6.iam.gserviceaccount.com"
}
private static String getAccessToken() throws IOException {
GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(new FileInputStream("service-account.json"))
.createScoped(Arrays.asList(SCOPES));
googleCredentials.refreshAccessToken();
return googleCredentials.getAccessToken().getTokenValue();
}
这种方式客户端也是可以收到FCM Message 的
–至:大新
原文地址:https://blog.csdn.net/Jason_HD/article/details/129287452
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_18921.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!