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

