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

Firebase推送通知中获取gcm.notification.payload字段值异常求助

解决FCM推送自定义payload无法获取的问题

兄弟,我之前也碰到过一模一样的坑!推送能收到但自定义数据死活拿不到,折腾了好一阵子才搞明白,大概率是这两个地方出问题了:


1. 先检查你的PHP推送格式是不是错了

FCM的推送分通知消息和数据消息,如果你的自定义payload是放在notification字段里的,那iOS系统会优先处理通知UI,不会把嵌套的payload原封不动传给你的应用!

正确的做法是把自定义数据放在data字段下,比如你的PHP脚本应该改成这样:

$fields = [
    'to' => $fcm_token,
    // 通知UI相关的内容放这里
    'notification' => [
        'title' => '你的通知标题',
        'body' => '你的通知内容'
    ],
    // 自定义payload必须放data字段里!
    'data' => [
        'payload' => [
            'type' => '你要传的类型',
            'other_key' => '其他自定义数据'
        ]
    ]
];

如果之前你是把payload嵌套在notification里,那iOS这边根本拿不到这部分数据,系统直接吃掉了。


2. iOS端解析userInfo的正确姿势

不管你是用旧的AppDelegate方法还是新的UNUserNotificationCenter代理,拿到userInfo后,要先从data字段里取自定义数据,而不是找什么gcm.notification.payload。

举个Swift的例子(用新的通知中心代理,iOS10+推荐):

import UserNotifications

// 先在AppDelegate里注册通知中心代理
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UNUserNotificationCenter.current().delegate = self
    // 其他初始化代码...
    return true
}

// 前台接收推送的处理
extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo
        
        // 一步步解析自定义payload
        if let dataDict = userInfo["data"] as? [String: Any],
           let payload = dataDict["payload"] as? [String: Any],
           let type = payload["type"] as? String {
            print("终于拿到type了:\(type)")
            // 这里处理你的业务逻辑
        }
        
        // 允许前台显示通知
        completionHandler([.banner, .sound])
    }

    // 点击通知进入应用的处理
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        
        // 同样的解析逻辑
        if let dataDict = userInfo["data"] as? [String: Any],
           let payload = dataDict["payload"] as? [String: Any],
           let type = payload["type"] as? String {
            print("点击通知拿到type:\(type)")
        }
        
        completionHandler()
    }
}

3. 终极排查技巧:打印完整的userInfo

如果还是拿不到,直接把整个userInfo打印出来,看看里面到底有哪些键值对:

print("完整的userInfo内容:\(userInfo)")

这样你就能清楚看到自定义数据到底存在哪个键下面,比如可能是aps里的某个字段?或者PHP那边的键名写错了?根据打印结果调整解析逻辑就行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:59:56