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
相关产品推荐
相关产品推荐

