

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

# 使用特定于平台的有效载荷发布 Amazon SNS 通知
<a name="sns-send-custom-platform-specific-payloads-mobile-devices"></a>

您可以使用 Amazon Web Services 管理控制台 或 Amazon SNS APIs 向移动设备发送包含特定平台负载的自定义消息。有关使用 Amazon SNS 的信息 APIs，请参阅[移动推送 API 操作](mobile-push-api.md)和中的`SNSMobilePush.java`文件。`[snsmobilepush.zip](samples/snsmobilepush.zip)`

## 发送 JSON 格式化的消息
<a name="mobile-push-send-json"></a>

在发送平台特定的负载时，数据必须格式化为 JSON 键-值对字符串（用引号进行转义）。

下面的示例显示 FCM 平台的一条自定义消息。

```
{
"GCM": "{\"fcmV1Message\": {\"message\": {\"notification\": {\"title\": \"Hello\", \"body\": \"This is a test.\"}, \"data\": {\"dataKey\": \"example\"}}}}"
}
```

## 发送平台特定的消息
<a name="mobile-push-send-platform"></a>

除了以键-值对形式发送自定义数据之外，您还可以发送平台特定的键-值对。

以下示例显示如何在 FCM `data` 参数中的自定义数据键-值对之后加入 FCM 参数 `time_to_live` 和 `collapse_key`。

```
{
"GCM": "{\"fcmV1Message\": {\"message\": {\"notification\": {\"title\": \"TitleTest\", \"body\": \"Sample message for Android or iOS endpoints.\"}, \"data\":{\"time_to_live\": 3600,\"collapse_key\":\"deals\"}}}}"
}
```

有关 Amazon SNS 中支持的每个推送通知服务所支持的键-值对列表，请参阅以下内容：

**重要**  
Amazon SNS 现在支持 Firebase Cloud Messaging（FCM）HTTP v1 API，用于向 Android 设备发送移动推送通知。  
2024 年 3 月 26 日 – Amazon SNS 支持适用于 Apple 设备和 Webpush 目的地的 FCM HTTP v1 API。我们建议您在 2024 年 6 月 1 日或之前将现有的移动推送应用程序迁移到最新的 FCM HTTP v1 API，以避免应用程序中断。
+  APNs 文档中的@@ [有效载荷密钥参考](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html#/apple_ref/doc/uid/TP40008194-CH17-SW1)
+ FCM 文档中的 [Firebase 云消息收发 HTTP 协议](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)
+ ADM 文档中的[发送消息](https://developer.amazon.com/sdk/adm/sending-message.html)

## 在多个平台上向应用程序发送消息
<a name="mobile-push-send-multiplatform"></a>

要向安装在多个平台（例如 FCM 和）设备上的应用程序发送消息 APNs，您必须先在移动终端节点上订阅 Amazon SNS 中的主题，然后将消息发布到该主题。

以下示例显示了向 FCM 和 ADM 上 APNs订阅的移动终端节点发送的消息：

```
{ 
  "default": "This is the default message which must be present when publishing a message to a topic. The default message will only be used if a message is not present for 
one of the notification platforms.",     
  "APNS": "{\"aps\":{\"alert\": \"Check out these awesome deals!\",\"url\":\"www.amazon.com\"} }",
  "GCM": "{\"data\":{\"message\":\"Check out these awesome deals!\",\"url\":\"www.amazon.com\"}}",
  "ADM": "{\"data\":{\"message\":\"Check out these awesome deals!\",\"url\":\"www.amazon.com\"}}" 
}
```

## 将消息 APNs 作为警报或后台通知发送到
<a name="mobile-push-send-message-apns-background-notification"></a>

Amazon SNS 可以向广告 APNs 发送消息`alert`或`background`通知（有关更多信息，请参阅 APNs 文档中的[将后台更新推送到您的应用程序](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/pushing_background_updates_to_your_app)）。
+ `alert` APNs 通知通过显示警报消息、播放声音或在应用程序的图标上添加徽章来通知用户。
+ `background` APNs 通知会被唤醒或指示您的应用程序根据通知的内容采取行动，而不通知用户。

### 指定自定义 APNs 标题值
<a name="specify-custom-header-value"></a>

我们建议使用 Amazon SNS `Publish` API 操作为`AWS.SNS.MOBILE.APNS.PUSH_TYPE`[保留消息属性](sns-message-attributes.md#sns-attrib-mobile-reserved)指定自定义值 Amazon SDKs，或。 Amazon CLI以下 CLI 示例为指定的主题将 `content-available` 设置为 `1` 并将 `apns-push-type` 设置为 `background`。

```
aws sns publish \
--endpoint-url https://sns.us-east-1.amazonaws.com \
--target-arn arn:aws:sns:us-east-1:123456789012:endpoint/APNS_PLATFORM/MYAPP/1234a567-bc89-012d-3e45-6fg7h890123i \
--message '{"APNS_PLATFORM":"{\"aps\":{\"content-available\":1}}"}' \
--message-attributes '{ \
  "AWS.SNS.MOBILE.APNS.TOPIC":{"DataType":"String","StringValue":"com.amazon.mobile.messaging.myapp"}, \
  "AWS.SNS.MOBILE.APNS.PUSH_TYPE":{"DataType":"String","StringValue":"background"}, \
  "AWS.SNS.MOBILE.APNS.PRIORITY":{"DataType":"String","StringValue":"5"}}' \
--message-structure json
```

**注意**  
确保 JSON 结构有效。在每个键/值对（最后一个除外）后面添加一个逗号。

### 根据有效载荷 APNs 推断推送类型标头
<a name="inferring-push-type-header-from-payload"></a>

如果您未设置`apns-push-type` APNs 标头，Amazon SNS 会`background`根据您的 JSON 格式的负载 APNs 配置`aps`字典中的`content-available`密钥将标头设置为`alert`或依据。

**注意**  
Amazon SNS 只能推断 `background` 或 `alert` 标头，尽管 `apns-push-type` 标头可以设置为其他值。
+ `apns-push-type` 设置为 `alert`
  + 如果 `aps` 字典包含设置为 `1` 的 `content-available` 和*一个或多个*触发用户交互的键。
  + 如果 `aps` 字典包含设置为 `0` 的 `content-available` *或*如果 `content-available` 密钥不存在。
  + 如果 `content-available` 键的值不是整数或布尔值。
+ `apns-push-type` 设置为 `background`
  + 如果 `aps` 字典*仅*包含设置为 `1` 的 `content-available` 且不包含触发用户交互的*其他键*。
**重要**  
如果 Amazon SNS 将原始配置对象 APNs 作为仅限后台的通知发送，则必须在字典中包含`content-available`设置为。`1` `aps`尽管您可以包含自定义键，但 `aps` 字典不得包含触发用户交互的任何键（例如，警报、徽章或声音）。

下面是一个示例原始配置对象。

```
{
  "APNS": "{\"aps\":{\"content-available\":1},\"Foo1\":\"Bar\",\"Foo2\":123}"
}
```

在本示例中，Amazon SNS 将消息的`apns-push-type` APNs 标头设置为。`background`当 Amazon SNS 检测到 `apn` 字典包含设置为 `1` 的 `content-available` 键—并且不包含任何其他可触发用户交互的键时—它将标题设置为 `background`。