基于Node.js与Flutter的FCM语音/视频通话通知实现方案
在Node.js中通过FCM发送带铃声的长时长通话通知
1. 依赖选择与安装
官方推荐使用firebase-admin SDK实现FCM消息发送,稳定性更有保障。执行以下命令安装依赖:
npm install firebase-admin
2. 初始化FCM SDK
先从Firebase控制台下载项目的服务账号密钥(JSON格式),再完成SDK初始化:
const admin = require('firebase-admin'); const serviceAccount = require('./path/to/your-service-account-key.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: 'https://your-firebase-project-id.firebaseio.com' });
3. 构造并发送通话通知
通话通知需要高优先级、自定义铃声,且要实现长时长持续显示(无法被用户手动划除),以下是完整的消息构造与发送代码:
async function sendIncomingCallNotification(deviceToken) { const callMessage = { token: deviceToken, // 基础通知内容 notification: { title: '来电提醒', body: '张三正在呼叫你' }, // Android平台专属配置 android: { priority: 'high', // 高优先级确保通知及时送达 notification: { channelId: 'incoming_call_channel', // 需在Android客户端提前创建该通知通道 sound: 'call_ringtone.mp3', // 自定义铃声文件(放在Android项目res/raw目录) ongoing: true, // 标记为持续通知,无法手动清除 sticky: true, priority: 'MAX' } }, // iOS平台专属配置 apns: { payload: { aps: { sound: 'call_ringtone.wav', // iOS项目中的铃声文件 contentAvailable: true, category: 'INCOMING_CALL' // 需在iOS客户端配置对应通知类别 } }, headers: { 'apns-priority': '5', // 高优先级 'apns-push-type': 'alert' } }, // 附加业务数据,供客户端处理通话逻辑 data: { callId: 'CALL_20240520_001', callerId: 'user_123', callerName: '张三', callType: 'voice' } }; try { const sendResult = await admin.messaging().send(callMessage); console.log('通话通知发送成功:', sendResult); } catch (err) { console.error('通话通知发送失败:', err); } } // 调用示例:传入目标设备的FCM令牌 sendIncomingCallNotification('USER_DEVICE_FCM_TOKEN');
关键注意事项
- Android客户端通道配置:必须提前在Android客户端创建
incoming_call_channel通知通道,设置通道铃声、优先级为HIGH,否则自定义铃声和高优先级不生效。 - iOS客户端类别配置:需在iOS客户端注册
INCOMING_CALL通知类别,关联接听/挂断等操作,同时确保铃声文件已正确添加到项目中。 - 长时长实现逻辑:Android通过
ongoing: true让通知持续显示,直到通话结束后由客户端主动取消;iOS若为VoIP通话,推荐使用APNS的VoIP推送(比普通FCM更可靠),并通过后台逻辑维持通知活跃。 - 权限要求:Android 13及以上版本,客户端需主动申请
POST_NOTIFICATIONS权限;iOS需开启通知权限,并配置正确的后台模式。 - 铃声文件规范:Android支持MP3、WAV等格式,放在
res/raw目录;iOS铃声需为CAF或WAV格式,时长不超过30秒,添加后需在Info.plist中声明。
内容的提问来源于stack exchange,提问作者alaa
相关产品推荐
相关产品推荐

