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

