在亚马逊 SNS 中使用谷歌 Firebase 云消息 (FCM) v1 有效负载 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在亚马逊 SNS 中使用谷歌 Firebase 云消息 (FCM) v1 有效负载

亚马逊 SNS 支持使用 FCM HTTP v1 API 向安卓、iOS 和 Webpush 目的地发送通知。本主题提供了使用 CLI 或 Amazon SNS API 发布移动推送通知时的有效负载结构示例。

发送 FCM 通知时,您可以在有效负载中包含以下消息类型:

  • 数据消息-数据消息由您的客户端应用程序处理,并包含自定义键值对。在构造数据消息时,必须包含以 JSON 对象作为值的data密钥,然后输入您的自定义键值对。

  • 通知消息显示消息-通知消息包含 FCM SDK 处理的一组预定义密钥。这些密钥因您要交付的设备类型而异。有关特定于平台的通知密钥的更多信息,请参阅以下内容:

有关 FCM 消息类型的更多信息,请参阅 Google 的 F irebas e 文档中的消息类型

使用 FCM v1 有效负载结构发送消息

如果您是首次创建 FCM 应用程序,或者希望利用 FCM v1 的功能,则可以选择发送 FCM v1 格式的有效负载。为此,必须包含顶级密钥fcmV1Message有关构建 FCM v1 有效负载的更多信息,请参阅 Google 的 Firebase 文档中的从旧版 FCM API 迁移到 HTTP v1跨平台自定义消息

发送到亚马逊 SNS 的 FCM v1 有效负载示例:

注意

使用 Amazon SNS 发布通知时,以下示例中使用的GCM密钥值必须编码为字符串。

{ "GCM": "{ \"fcmV1Message\": { \"validate_only\" : false, \"message\" : { \"notification\": { \"title\": \"string\", \"body\": \"string\" }, \"data\": { \"dataGen\": \"priority message\", }, \"android\": { \"priority\": \"high\", \"notification\": { \"body_loc_args\": [ \"string\" ], \"title_loc_args\": [ \"string\" ], \"sound\": \"string\", \"title_loc_key\": \"string\", \"title\": \"string\", \"body\": \"string\", \"click_action\": \"clicky_clacky\", \"body_loc_key\": \"string\" }, \"data\": { \"dataAndroid\": \"priority message\", }, \"ttl\": \"10023.32s\" }, \"apns\": { \"payload\": { \"aps\": { \"alert\": { \"subtitle\": \"string\", \"title-loc-args\": [ \"string\" ], \"title-loc-key\": \"string\", \"loc-args\": [ \"string\" ], \"loc-key\": \"string\", \"title\": \"string\", \"body\": \"string\" }, \"category\": \"Click\", \"content-available\": 0, \"sound\": \"string\", \"badge\": 5 } } }, \"webpush\": { \"notification\": { \"badge\": \"5\", \"title\": \"string\", \"body\": \"string\" }, \"data\": { \"dataWeb\": \"priority message\", } } } } }" }

发送 JSON 负载时,请务必在请求中包含该message-structure属性,并将其设置为json

CLI 示例:

aws sns publish --topic $TOPIC_ARN --message '{"GCM": "{\"fcmV1Message\": {\"message\":{\"notification\":{\"title\":\"string\",\"body\":\"string\"},\"android\":{\"priority\":\"high\",\"notification\":{\"title\":\"string\",\"body\":\"string\"},\"data\":{\"customAndroidDataKey\":\"custom key value\"},\"ttl\":\"0s\"},\"apns\":{\"payload\":{\"aps\":{\"alert\":{\"title\":\"string\", \"body\":\"string\"},\"content-available\":1,\"badge\":5}}},\"webpush\":{\"notification\":{\"badge\":\"URL\",\"body\":\"Test\"},\"data\":{\"customWebpushDataKey\":\"priority message\"}},\"data\":{\"customGeneralDataKey\":\"priority message\"}}}}", "default": "{\"notification\": {\"title\": \"test\"}"}' --region $REGION --message-structure json

有关发送 FCM v1 格式的负载的更多信息,请参阅 Google 的 Firebase 文档中的以下内容:

使用传统负载结构向 FCM v1 API 发送消息

迁移到 FCM v1 时,您无需更改用于旧版凭证的有效负载结构。Amazon SNS 会将您的有效载荷转换为新的 FCM v1 有效载荷结构,然后发送给 Google。

输入消息有效载荷格式:

{ "GCM": "{\"notification\": {\"title\": \"string\", \"body\": \"string\", \"android_channel_id\": \"string\", \"body_loc_args\": [\"string\"], \"body_loc_key\": \"string\", \"click_action\": \"string\", \"color\": \"string\", \"icon\": \"string\", \"sound\": \"string\", \"tag\": \"string\", \"title_loc_args\": [\"string\"], \"title_loc_key\": \"string\"}, \"data\": {\"message\": \"priority message\"}}" }

发送给谷歌的消息:

{ "message": { "token": "***", "notification": { "title": "string", "body": "string" }, "android": { "priority": "high", "notification": { "body_loc_args": [ "string" ], "title_loc_args": [ "string" ], "color": "string", "sound": "string", "icon": "string", "tag": "string", "title_loc_key": "string", "title": "string", "body": "string", "click_action": "string", "channel_id": "string", "body_loc_key": "string" }, "data": { "message": "priority message" } }, "apns": { "payload": { "aps": { "alert": { "title-loc-args": [ "string" ], "title-loc-key": "string", "loc-args": [ "string" ], "loc-key": "string", "title": "string", "body": "string" }, "category": "string", "sound": "string" } } }, "webpush": { "notification": { "icon": "string", "tag": "string", "body": "string", "title": "string" }, "data": { "message": "priority message" } }, "data": { "message": "priority message" } } }

潜在风险

  • 旧版到 v1 的映射不支持 Apple 推送通知服务 (APNS) headers 或密钥。fcm_options如果您想使用这些字段,请发送 FCM v1 有效负载。

  • 在某些情况下,FCM v1 要求消息标头才能向您的 APNs 设备发送静默通知。如果您当前正在向您的 APNs 设备发送静默通知,则它们不适用于传统方法。相反,我们建议使用 FCM v1 有效负载以避免意外问题。要查找 APN 标题列表及其用途,请参阅《Apple 开发者指南》中的 “与 APN 通信”。

  • 如果您在发送通知时使用的是 TTL Amazon SNS 属性,则只会在该android字段中进行更新。如果您想设置 TTL APNS 属性,请使用 FCM v1 有效负载。

  • androidapns、和webpush键将被映射并填充所提供的所有相关密钥。例如,如果您提供title(这是所有三个平台共享的密钥),FCM v1 映射将使用您提供的标题填充所有三个平台。

  • 一些平台间的共享密钥需要不同的值类型。例如,传递给的badge键需要apns一个整数值,而传递给的badgewebpush需要一个字符串值。如果您提供了badge密钥,FCM v1 映射将仅填充您为其提供了有效值的密钥。

FCM 交付失败事件

下表提供了 Amazon SNS 故障类型,该类型与从 Google 收到的 FCM v1 通知请求的错误/状态代码相对应。当您为应用程序设置交付状态日志 CloudWatch 时,可以查看从 FCM v1 API 收到的所有观察到的错误代码。

FCM 错误/状态码 亚马逊 SNS 故障类型 失败消息 原因和缓解措施

UNREGISTERED

InvalidPlatformToken

与终端节点关联的平台令牌无效。

连接到您的终端节点的设备令牌已过时或无效。Amazon SNS 禁用了您的终端节点。将 Amazon SNS 终端节点更新为最新的设备令牌。

INVALID_ARGUMENT

InvalidNotification

通知正文无效。

设备令牌或消息负载可能无效。验证您的消息负载是否有效。如果消息负载有效,请将 Amazon SNS 终端节点更新为最新的设备令牌。

SENDER_ID_MISMATCH

InvalidPlatformToken

与终端节点关联的平台令牌无效。

与设备令牌关联的平台应用程序无权向设备令牌发送消息。确认您在 Amazon SNS 平台应用程序中使用了正确的 FCM 凭证。

UNAVAILABLE

DependencyUnavailable

依赖关系不可用。

FCM 无法及时处理请求。Amazon SNS 执行的所有重试都失败了。您可以将这些消息存储在死信队列 (DLQ) 中,稍后再重新驱动它们。

INTERNAL

UnexpectedFailure

意外故障;请联系 Amazon。失败短语 [内部错误]。

FCM 服务器在尝试处理您的请求时遇到错误。Amazon SNS 执行的所有重试都失败了。您可以将这些消息存储在死信队列 (DLQ) 中,稍后再重新驱动它们。

THIRD_PARTY_AUTH_ERROR

InvalidCredentials

平台应用程序凭证无效。

无法发送针对 iOS 设备或 Webpush 设备的消息。验证您的开发和生产凭证是否有效。

QUOTA_EXCEEDED

Throttled

请求受 [gcm] 限制。

已超过消息速率配额、设备消息速率配额或主题消息速率配额。有关如何解决此问题的信息,请参阅 ErrorCodeGoogle 的 Firebase 文档中的。

PERMISSION_DENIED

InvalidNotification

通知正文无效。

如果出现PERMISSION_DENIED异常,则调用方(您的 FCM 应用程序)无权在负载中执行指定操作。导航到您的 FCM 控制台,并验证您的凭证是否启用了所需的 API 操作。