无法通过FCM负载发送高优先级推送通知 寻求技术排查
FCM高优先级推送排查与修复
以下是你代码中的核心问题及修复方案:
1. 通知负载结构错误,未正确使用notification字段
视频通话场景需要触发系统级即时通知,必须将title、body等显示内容放在**notification字段**下,而非data字段。仅用data字段的消息在App后台/杀死状态下,不会主动弹出系统通知,也无法保证高优先级即时送达。
2. 未定义的$notis变量导致负载异常
代码中'fcm_options'=>$notis的$notis变量从未初始化,JSON编码后会产生null值,FCM服务器可能忽略该字段,甚至影响消息的正常处理。
3. 跨平台高优先级配置不完整
仅设置根节点的priority":"high"不足以覆盖所有平台:
- Android:需要
notification字段存在,配合priority":"high - iOS:需额外配置
apns字段,设置apns-priority为10,确保iOS设备在后台也能即时接收
4. 无效根节点字段
根节点中的image、uri是FCM不识别的字段,应移至notification(用于通知栏显示)或data(用于App内部逻辑),或通过fcm_options.link配置跳转链接。
修复后的完整代码示例
define('API_ACCESS_KEY','##'); $fcmUrl = 'https://fcm.googleapis.com/fcm/send'; $token="###"; $title = "视频通话邀请"; // 补充实际标题 $msg = "XXX邀请你进行视频通话"; // 补充实际内容 // 通知栏显示内容(系统级通知) $notification = [ 'title' => $title, 'body' => $msg, 'image' => 'https://mbracecloud.com/appln_enterprise/images_user/5000350004651664275771-2.jpg', 'tag' => 'Receive' ]; // App内部需要的自定义数据 $data = [ 'uri' => "https://mbracecloud.com/index_n.php?vsn=9302010101&nf=Yes&cnt=India&window=1&connect=Mail&mail=business@mbracecloud.com" ]; $fcmNotification = [ 'to' => $token, 'priority' => "high", // 配置iOS高优先级 'apns' => [ 'headers' => [ 'apns-priority' => '10' ] ], 'notification' => $notification, 'data' => $data, // 配置跳转链接(可选,替代data里的uri) 'fcm_options' => [ 'link' => "https://mbracecloud.com/index_n.php?vsn=9302010101&nf=Yes&cnt=India&window=1&connect=Mail&mail=business@mbracecloud.com" ] ]; $headers = [ 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$fcmUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fcmNotification)); $result = curl_exec($ch); curl_close($ch); // 打印FCM返回结果,便于排查错误 var_dump($result); echo $token;
额外排查建议
- 检查
API_ACCESS_KEY和token是否有效,FCM返回结果中会提示无效凭据或令牌的错误 - 确保App端已正确配置FCM接收逻辑,特别是后台状态下的通知监听
- 测试时使用真实设备,模拟器可能无法完全模拟高优先级推送的即时性
内容的提问来源于stack exchange,提问作者Ahamed
相关产品推荐
相关产品推荐

