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

使用Node.js通过SNS推送通知:APNS额外参数传递及data中type丢失问题排查

使用Node.js通过SNS推送通知:APNS额外参数传递及data中type丢失问题排查

嘿,我一眼就看出问题所在了——你APNS的payload结构不符合苹果推送服务的规范,这就是为什么自定义的type字段没传到iOS设备上。

先给你理清楚:GCM(现在叫FCM)的结构里用data字段存自定义参数是没问题的,但APNS的规则不一样,它不认可这种单独的data字段。苹果要求自定义的额外参数要和aps对象平级放在payload里,而不是嵌套在某个data节点下。

咱们直接看修正后的代码,对比一下你原来的写法:

const payload = {
  default: body,
  // GCM的结构没问题,保持原样
  GCM: JSON.stringify({
    notification: {
      body,
      title,
    },
    data: {
      type
    },
  }),
  // 重点修正APNS的结构
  APNS: JSON.stringify({
    aps: {
      alert: {
        title,
        body,
      },
    },
    // 把type直接放在aps同级,不需要包裹在data里
    type: type
  }),
};

return JSON.stringify(payload);

为什么要这么改?

  • APNS的payload格式规定,所有系统相关的配置(比如alert、badge、sound)都放在aps对象里,而你的业务自定义参数(比如type)要直接跟aps平级存放,苹果会自动把这些额外字段原封不动地传递给你的iOS应用。
  • 你原来的写法里,把data字段放在了APNS对象的顶级,这不是APNS认可的结构,所以SNS在转发给苹果服务器的时候,会忽略掉这个不规范的data字段,导致你的type丢失。

另外还要提醒你一下,APNS对payload的大小有严格限制:普通推送不能超过4KB,静默推送不能超过5KB,所以自定义参数不要加太多内容,避免触发大小限制导致推送失败。

备注:内容来源于stack exchange,提问作者IdleSolution

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:29:03