Firebase FCM消息无法通过PHP推送到苹果设备求助
问题分析与解决方案
你的核心问题是FCM消息结构不符合iOS APNs的规范要求:
- Firebase控制台发送通知时,会自动生成符合APNs标准的消息体,包含
notification字段,因此iOS设备能正常接收并弹出系统通知。 - 你的PHP代码仅使用
data字段发送消息,iOS系统在App后台/未启动状态下,不会主动处理纯data类型的消息,只有App前台运行时,Flutter的消息监听才能捕获到data内容。
修正后的PHP FCM代码
$serverKey = '你的FCM服务器密钥'; $url = 'https://fcm.googleapis.com/fcm/send'; $fields = array( 'registration_ids' => [ "dwUpMuQLfU1DtoVJtP9MF8:APA91bHLxdctbSvx-7e1YZTPwq6I0_A_lVpyTH5F6jLeIlnsmsdD_D6cqkym6XRoYOhCT6JYhubzaYmytb3P5Wyv6rJCR3FBDjpu0YIH803b0bl7eKEq3egdbXRUkH6PQzHkcelCGaEW", "ea2RfrXsT7CA51U0ZCLMqR:APA91bEcnGd69w8crkGx8MAVUsNbZqBScaNkgEmOuck-fKb0vYqtm741z9D3u0pSgVjQLxJG__8GAQzRQvTGYzaY6ve7WoPF7xGZozoOpnxHkTyMpRsLtCcML5XVNVvS-Me3A4MhjiaG" ], // 新增notification字段,满足APNs要求,确保iOS后台能触发系统通知弹窗 'notification' => array( "title" => "Admin Responded to your Grievance", "body" => "Test Message", "sound" => "default" ), 'data' => array( "time" => strtotime($date) * 1000, "type" => "notification", "sound" => "default", // 清理重复键,保留业务自定义数据 "custom_message" => "Test Message" ) ); $fields = json_encode($fields); $headers = array( 'Authorization: key=' . $serverKey, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); $result = curl_exec($ch); curl_close($ch); print_r($result);
关键注意事项
- 强制包含
notification字段:iOS的APNs要求消息体必须包含notification来触发系统级通知,后台状态下纯data消息不会弹出通知,仅能在App前台被监听捕获。 - 清理重复键:原代码中
data字段重复定义了message和time,JSON序列化时后定义的键会覆盖前者,需避免此类冗余。 - 字段对应规则:
notification中的title对应通知标题,body对应通知内容,sound设为default可触发系统提示音。
若修正后仍无法接收,可排查以下点:
- 确认
registration_ids是iOS设备的有效FCM令牌(iOS与Android令牌格式不同,请勿混用) - 检查Firebase项目中iOS配置的p8文件是否正确关联,Bundle ID完全匹配
- 查看FCM控制台的消息报告,确认消息是否成功送达APNs
内容的提问来源于stack exchange,提问作者Coding Frontend
相关产品推荐
相关产品推荐

