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

Swift4:通过PHP服务器发送Firebase推送通知失败问题排查

排查Swift4 + Firebase推送PHP服务端无法生效的问题

看起来你已经搞定了Firebase控制台推送,但PHP服务端推送遇到了卡点,我帮你梳理几个最关键的排查方向,你可以逐一验证:


1. 确认PHP请求的核心配置是否正确

这是最容易出错的环节,一定要仔细核对:

  • 服务器密钥是否正确:必须使用Firebase控制台「项目设置」→「云消息传递」中的服务器密钥(不是Web API密钥),复制时不要带多余空格或换行。
  • 请求头部是否齐全:
    • 必须包含 Authorization: key=你的服务器密钥
    • 必须设置 Content-Type: application/json
    • iOS 13+ 设备需要额外添加 apns-push-type: alert 和 apns-topic: 你的App Bundle ID 头部
  • 设备Token是否有效:确保PHP中使用的token是App端最新获取的FCM Token(也就是你代码中refreshToken打印的值),Token过期或拼写错误会直接导致推送失败。

2. 检查FCM Payload格式是否符合要求

FCM对推送Payload的格式有严格要求,常见问题包括:

  • 如果是通知消息(前台/后台直接显示通知),必须包含notification字段的核心参数,比如title、body;
  • 如果是数据消息(需要App手动处理),要放在data字段下;
  • 务必设置priority: high,确保推送能及时送达iOS设备。

这里给你一个标准的PHP请求示例,你可以参考调整:

<?php
$url = 'https://fcm.googleapis.com/fcm/send';
$serverKey = '你的Firebase服务器密钥';
$fcmToken = '设备的FCM Token';

$headers = [
    'Authorization: key=' . $serverKey,
    'Content-Type: application/json',
    'apns-push-type: alert',
    'apns-topic: com.yourapp.bundleid' // 替换为你的App Bundle ID
];

$payload = [
    'to' => $fcmToken,
    'notification' => [
        'title' => 'PHP推送测试',
        'body' => '这是来自PHP服务端的推送消息'
    ],
    'data' => [
        'custom_data' => '自定义内容'
    ],
    'priority' => 'high'
];

$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($payload));

$result = curl_exec($ch);
if ($result === FALSE) {
    die('Curl请求失败: ' . curl_error($ch));
}
curl_close($ch);

// 打印FCM返回的响应,便于排查错误
echo 'FCM响应结果: ' . $result;
?>

3. 补全AppDelegate中缺失的FCM回调方法

你的当前代码缺少几个关键的FCM回调,会导致无法正确处理推送和Token更新:

  • 首先在didFinishLaunchingWithOptions中设置Messaging代理:
    Messaging.messaging().delegate = self
    
  • 然后实现Messaging的Token更新回调,确保服务器能拿到最新的Token:
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        guard let token = fcmToken else { return }
        print("最新FCM Token: \(token)")
        // 这里调用你的API,把Token上传到PHP服务器
    }
    
  • 最后实现推送接收的回调,便于调试:
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print("收到推送内容: \(userInfo)")
        completionHandler(.newData)
    }
    

4. 排查PHP服务器的网络与权限

  • 确保PHP服务器能正常访问https://fcm.googleapis.com/fcm/send,没有被防火墙、代理或安全组拦截;
  • 查看PHP的错误日志,或者通过curl_error()打印请求错误信息,FCM会返回明确的错误码(比如InvalidRegistration表示Token无效,AuthenticationError表示服务器密钥错误),这些信息能快速定位问题。

内容的提问来源于stack exchange,提问作者Al-shimaa Adel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:00:38