You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS应用FCM推送异常:PHP返回成功但收不到通知,控制台也失效

哥们儿,我碰到过好几次这种FCM推送的坑,咱们一步步排查解决:

一、先确认设备令牌(Tokens)的有效性

这是最常见的问题:

  • iOS的APNs令牌会在很多场景下刷新(比如重装APP、系统大版本更新、用户切换Apple ID),如果你的服务端存的是旧令牌,FCM会标记这个令牌为无效,之后不管是接口还是控制台发送都会失败。
  • 先去Firebase控制台的Cloud Messaging模块,找到之前成功发送的记录,对比现在服务端用的令牌是否一致;另外一定要在APP里集成FCM的令牌刷新回调,确保每次启动APP都能获取最新令牌并同步到服务端。
二、检查PHP接口的Payload格式是否符合iOS的FCM要求

你的代码只贴了一部分,iOS对FCM的Payload格式有严格要求,尤其是通知类消息:

  • 如果是要在前台/后台都能弹出通知的通知消息,必须包含notification字段,而且要带上sound(iOS需要这个字段触发通知提示音);如果是数据消息(需要APP自己处理逻辑),要确保data字段格式正确,同时APP的Info.plist要配置remote-notification后台权限。
  • 给你一个符合要求的PHP Payload示例:
function send_notification ($tokens, $message) {
    $url = 'https://fcm.googleapis.com/fcm/send';
    $server_key = '你的Firebase服务器密钥'; // 从Firebase控制台项目设置->云消息传递获取
    
    $headers = [
        'Authorization: key=' . $server_key,
        'Content-Type: application/json'
    ];
    
    $fcm_payload = [
        'registration_ids' => $tokens, // 多设备发送用这个,单设备用'to' => $token
        'notification' => [
            'title' => '你的通知标题',
            'body' => '你的通知内容',
            'sound' => 'default' // 必须加这个,iOS才会弹出通知
        ],
        'priority' => 'high' // iOS后台推送需要高优先级才能及时送达
    ];
    
    $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_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fcm_payload));
    
    $result = curl_exec($ch);
    curl_close($ch);
    
    // 一定要打印返回结果,排查隐藏错误
    var_dump($result);
    return $result;
}
三、排查FCM返回的隐藏错误

虽然你的接口说返回成功,但FCM经常会返回"成功"但包含无效令牌的细节,比如返回里有"results": [{"error": "InvalidRegistration"}],这就说明令牌无效。所以一定要把接口的返回值打印出来,看具体的错误信息,这是快速定位问题的关键。

四、检查iOS设备端的配置和状态
  • 确认设备的通知权限是开启的:打开系统设置->通知->你的APP,确保允许通知、声音、Badge都勾选了。
  • 检查APP的Info.plist配置:必须添加UIBackgroundModes,并包含remote-notification值,这样APP在后台才能接收推送。
  • 如果是iOS 13及以上版本,静默推送(只有数据没有通知弹窗)需要额外添加content-available: 1字段,而且不能同时包含notification字段,否则会被系统拦截。
五、重置FCM设备注册状态

如果之前用无效令牌发送过请求,FCM可能会把这个设备的注册状态标记为无效,导致控制台也发不了。可以试试:

  1. 在APP里调用Messaging.messaging().deleteToken()删除当前令牌,然后重启APP获取新的令牌。
  2. 把新令牌更新到服务端,再分别用Firebase控制台和PHP接口测试推送。

内容的提问来源于stack exchange,提问作者f rahimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:11:33