You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android应用中管理员向多名成员发送FCM推送通知的实现求助

实现管理员向所有社区成员发送FCM推送的完整指南(Android新手友好)

嘿,作为Android新手,要实现管理员给所有社区成员发FCM推送其实没那么复杂,我一步步给你捋清楚,保证你能跟上!

先搞懂核心逻辑:FCM主题订阅是你的最佳选择

因为你要给所有社区成员B发推送,最省心的方式就是用FCM的「主题订阅」功能:

  • 所有成员B的设备订阅同一个主题(比如叫community_members
  • 管理员A通过服务端(或者Firebase控制台)向这个主题发送推送,所有订阅的设备都会自动收到
  • 不用手动收集每个成员的FCM Token,省事儿还不容易出错

第一步:完成Firebase项目的基础配置

这是所有FCM功能的前提,别慌,跟着做:

  1. 去Firebase控制台创建一个新项目,然后添加你的Android应用(填包名、签名证书SHA-1,这些在Android Studio里能找到)
  2. 下载google-services.json,放到你Android项目的app目录下
  3. 配置项目级build.gradle(根目录下的那个):
buildscript {
    dependencies {
        // 添加Firebase插件
        classpath 'com.google.gms:google-services:4.4.1' // 用最新版本就行
    }
}
  1. 配置模块级build.gradle(app目录下的那个):
// 顶部添加插件
plugins {
    id 'com.android.application'
    id 'com.google.gms.google-services'
}

dependencies {
    // 添加FCM依赖
    implementation 'com.google.firebase:firebase-messaging:23.4.1' // 用最新版本
}

Sync一下项目,配置就完成了!


第二步:让社区成员B的设备订阅主题

每个成员的App启动后,要做两件事:获取FCM Token,然后订阅到指定主题。

1. 获取FCM Token(必要步骤)

在你的主Activity里添加代码,或者写个专门的工具类:

// Kotlin示例,Java写法类似
FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener { task ->
        if (!task.isSuccessful) {
            Log.w("FCM_TOKEN", "获取Token失败", task.exception)
            return@addOnCompleteListener
        }
        // 获取到的Token,你也可以上传到自己的服务器备份(可选)
        val token = task.result
        Log.d("FCM_TOKEN", "Token: $token")
    }

2. 订阅主题

获取Token后,马上订阅主题:

FirebaseMessaging.getInstance().subscribeToTopic("community_members")
    .addOnCompleteListener { task ->
        var msg = "订阅主题成功"
        if (!task.isSuccessful) {
            msg = "订阅主题失败"
        }
        Log.d("FCM_TOPIC", msg)
    }

这样所有成员的设备都会加入community_members这个主题组啦!


第三步:管理员A如何发送推送

这里要注意:绝对不能在管理员的Android App里直接发推送,因为需要用到FCM的服务器密钥,放在客户端会泄露,不安全!推荐两种方式:

方式1:用Firebase控制台快速测试(适合新手调试)

  1. 打开Firebase控制台,进入你的项目,点击左侧「Cloud Messaging」
  2. 点击「发送您的第一条消息」
  3. 填写通知标题、内容,然后在「目标」里选择「主题」,输入community_members
  4. 点击「发送测试消息」,选择你的测试设备(或者直接发送),所有订阅主题的设备都会收到通知!

方式2:自己搭建简单服务端(正式环境用)

如果要集成到管理员的后台系统里,可以写个简单的接口,用HTTP请求调用FCM的API。比如用Java的OkHttp示例:

// Java示例,需要导入OkHttp依赖
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n  \"to\": \"/topics/community_members\",\n  \"notification\": {\n    \"title\": \"管理员通知\",\n    \"body\": \"社区即将举办活动,记得参加!\"\n  },\n  \"data\": {\n    \"type\": \"activity\",\n    \"id\": \"123\"\n  }\n}");
Request request = new Request.Builder()
  .url("https://fcm.googleapis.com/fcm/send")
  .post(body)
  .addHeader("Authorization", "key=你的FCM服务器密钥") // 这里填你的服务器密钥
  .addHeader("Content-Type", "application/json")
  .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());

服务器密钥在哪里找?:Firebase控制台→项目设置→云消息传递→服务器密钥(复制那个长字符串)


第四步:让成员B的App接收并显示推送

成员的App需要处理收到的推送消息,创建一个继承FirebaseMessagingService的类:

class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)
        
        // 处理通知消息
        remoteMessage.notification?.let {
            showNotification(it.title, it.body)
        }
        
        // 处理数据消息(如果有的话)
        remoteMessage.data?.let {
            val type = it["type"]
            val id = it["id"]
            // 这里可以根据数据做自定义逻辑,比如跳转到指定页面
        }
    }
    
    // 显示系统通知的方法
    private fun showNotification(title: String?, body: String?) {
        val channelId = "community_notification"
        // 创建通知渠道(Android O及以上必须)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                channelId,
                "社区通知",
                NotificationManager.IMPORTANCE_DEFAULT
            )
            val manager = getSystemService(NotificationManager::class.java)
            manager.createNotificationChannel(channel)
        }
        
        val intent = Intent(this, MainActivity::class.java)
        val pendingIntent = PendingIntent.getActivity(
            this,
            0,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        
        val notification = NotificationCompat.Builder(this, channelId)
            .setContentTitle(title)
            .setContentText(body)
            .setSmallIcon(R.drawable.ic_notification) // 替换成你的通知图标
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)
            .build()
        
        NotificationManagerCompat.from(this).notify(1, notification)
    }
    
    // 处理Token刷新
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        // 这里可以把新的Token上传到你的服务器
        Log.d("FCM_NEW_TOKEN", "新Token: $token")
    }
}

然后在AndroidManifest.xml里注册这个Service:

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

别忘了添加权限(Android 13及以上需要POST_NOTIFICATIONS权限):

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

几个新手容易踩的坑

  • 一定要用真机测试,模拟器有时候会收不到FCM推送
  • 确保设备联网,并且没有禁用App的通知权限
  • 服务器密钥要保管好,绝对不能泄露到客户端代码里
  • 依赖版本要用最新的,避免兼容性问题

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

火山引擎 最新活动