发送消息 - AWS 最终用户消息推送

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

发送消息

AWS 最终用户消息推送API可以向特定的设备标识符发送交易推送通知。本节包含完整的代码示例,您可以使用这些示例通过 AWS 最终用户消息推送发送推送API通知 AWS SDK。

您可以使用这些示例通过 AWS 最终用户消息推送支持的任何推送通知服务发送推送通知。目前, AWS 最终用户消息推送支持以下渠道:Firebase 云消息 (FCM)、Apple 推送通知服务 (APNs)、百度云推送和亚马逊设备消息 (ADM)。

有关端点、区段和渠道的更多代码示例,请参阅代码示例

注意

当您通过 Firebase Cloud Messaging (FCM) 服务发送推送通知时,请在调用 “ AWS 最终用户消息推送API” 时使用该服务名称GCM。谷歌于 2018 年 4 月 10 日停止了谷歌云端消息 (GCM) 服务。但是, AWS 最终用户消息推送API使用GCM服务名称来表示其通过FCM服务发送的消息,以保持与GCM服务停用之前编写的API代码的兼容性。

GCM (AWS CLI)

以下示例使用发送消息通过发送消息发送GCM推送通知。 AWS CLI Replace(替换) token 使用设备的唯一令牌和 611e3e3cdd47474c9c1399a50example 使用您的应用程序标识符。

aws pinpoint send-messages \ --application-id 611e3e3cdd47474c9c1399a50example \ --message-request file://myfile.json \ --region us-west-2 Contents of myfile.json: { "Addresses": { "token": { "ChannelType" : 'GCM' } }, "MessageConfiguration": { "GCMMessage": { "Action": "URL", "Body": "This is a sample message", "Priority": "normal", "SilentPush": True, "Title": "My sample message", "TimeToLive": 30, "Url": "https://www.example.com" } } }

以下示例使用 send-mes sages 使用所有旧密钥发送GCM推送通知。 AWS CLI Replace(替换) token 使用设备的唯一令牌和 611e3e3cdd47474c9c1399a50example 使用您的应用程序标识符。

aws pinpoint send-messages \ --application-id 611e3e3cdd47474c9c1399a50example \ --message-request '{ "MessageConfiguration": { "GCMMessage":{ "RawContent": "{\"notification\": {\n \"title\": \"string\",\n \"body\": \"string\",\n \"android_channel_id\": \"string\",\n \"body_loc_args\": [\n \"string\"\n ],\n \"body_loc_key\": \"string\",\n \"click_action\": \"string\",\n \"color\": \"string\",\n \"icon\": \"string\",\n \"sound\": \"string\",\n \"tag\": \"string\",\n \"title_loc_args\": [\n \"string\"\n ],\n \"title_loc_key\": \"string\"\n },\"data\":{\"message\":\"hello in data\"} }", "TimeToLive" : 309744 } }, "Addresses": { "token": { "ChannelType":"GCM" } } }' \ --region us-east-1

以下示例使用 send-messages 通过发送消息发送带有FCMv1消息有效负载的GCM推送通知。 AWS CLI Replace(替换) token 使用设备的唯一令牌和 611e3e3cdd47474c9c1399a50example 使用您的应用程序标识符。

aws pinpoint send-messages \ --application-id 6a2dafd84bec449ea75fb773f4c41fa1 \ --message-request '{ "MessageConfiguration": { "GCMMessage":{ "RawContent": "{\n \"fcmV1Message\": \n {\n \"message\" :{\n \"notification\": {\n \"title\": \"string\",\n \"body\": \"string\"\n },\n \"android\": {\n \"priority\": \"high\",\n \"notification\": {\n \"title\": \"string\",\n \"body\": \"string\",\n \"icon\": \"string\",\n \"color\": \"string\",\n \"sound\": \"string\",\n \"tag\": \"string\",\n \"click_action\": \"string\",\n \"body_loc_key\": \"string\",\n \"body_loc_args\": [\n \"string\"\n ],\n \"title_loc_key\": \"string\",\n \"title_loc_args\": [\n \"string\"\n ],\n \"channel_id\": \"string\",\n \"ticker\": \"string\",\n \"sticky\": true,\n \"event_time\": \"2024-02-06T22:11:55Z\",\n \"local_only\": true,\n \"notification_priority\": \"PRIORITY_UNSPECIFIED\",\n \"default_sound\": false,\n \"default_vibrate_timings\": true,\n \"default_light_settings\": false,\n \"vibrate_timings\": [\n \"22s\"\n ],\n \"visibility\": \"VISIBILITY_UNSPECIFIED\",\n \"notification_count\": 5,\n \"light_settings\": {\n \"color\": {\n \"red\": 1,\n \"green\": 2,\n \"blue\": 3,\n \"alpha\": 6\n },\n \"light_on_duration\": \"112s\",\n \"light_off_duration\": \"1123s\"\n },\n \"image\": \"string\"\n },\n \"data\": {\n \"dataKey1\": \"priority message\",\n \"data_key_3\": \"priority message\",\n \"dataKey2\": \"priority message\",\n \"data_key_5\": \"priority message\"\n },\n \"ttl\": \"10023.32s\"\n },\n \"apns\": {\n \"payload\": {\n \"aps\": {\n \"alert\": {\n \"subtitle\": \"string\",\n \"title-loc-args\": [\n \"string\"\n ],\n \"title-loc-key\": \"string\",\n \"launch-image\": \"string\",\n \"subtitle-loc-key\": \"string\",\n \"subtitle-loc-args\": [\n \"string\"\n ],\n \"loc-args\": [\n \"string\"\n ],\n \"loc-key\": \"string\",\n \"title\": \"string\",\n \"body\": \"string\"\n },\n \"thread-id\": \"string\",\n \"category\": \"string\",\n \"content-available\": 1,\n \"mutable-content\": 1,\n \"target-content-id\": \"string\",\n \"interruption-level\": \"string\",\n \"relevance-score\": 25,\n \"filter-criteria\": \"string\",\n \"stale-date\": 6483,\n \"content-state\": {},\n \"timestamp\": 673634,\n \"dismissal-date\": 4,\n \"attributes-type\": \"string\",\n \"attributes\": {},\n \"sound\": \"string\",\n \"badge\": 5\n }\n }\n },\n \"webpush\": {\n \"notification\": {\n \"permission\": \"granted\",\n \"maxActions\": 2,\n \"actions\": [\n \"title\"\n ],\n \"badge\": \"URL\",\n \"body\": \"Hello\",\n \"data\": {\n \"hello\": \"hey\"\n },\n \"dir\": \"auto\",\n \"icon\": \"icon\",\n \"image\": \"image\",\n \"lang\": \"string\",\n \"renotify\": false,\n \"requireInteraction\": true,\n \"silent\": false,\n \"tag\": \"tag\",\n \"timestamp\": 1707259524964,\n \"title\": \"hello\",\n \"vibrate\": [\n 100,\n 200,\n 300\n ]\n },\n \"data\": {\n \"data1\": \"priority message\",\n \"data2\": \"priority message\",\n \"data12\": \"priority message\",\n \"data3\": \"priority message\"\n }\n },\n \"data\": {\n \"data7\": \"priority message\",\n \"data5\": \"priority message\",\n \"data8\": \"priority message\",\n \"data9\": \"priority message\"\n }\n }\n \n}\n}", "TimeToLive" : 309744 } }, "Addresses": { token: { "ChannelType":"GCM" } } }' \ --region us-east-1

如果使用 ImageUrl field forGCM,pinpoint 会将该字段作为数据通知发送pinpoint.notification.imageUrl,密钥为,这样可以防止图像开箱即用。请使用 RawContent 或添加对数据密钥的处理,例如将您的应用程序与集成 AWS Amplify。

Safari (AWS CLI)

你可以使用 “ AWS 最终用户消息推送” 向使用 Apple Safari 网络浏览器的 macOS 电脑发送消息。要向 Safari 浏览器发送消息,必须指定原始消息内容,且必须在消息有效负载中包含特定属性。为此,您可以在 A mazon Pinpoint 用户指南中创建带有原始消息有效负载的推送通知模板,或者直接在活动消息中指定原始消息内容。

注意

在向使用 Safari web 浏览器的 macOS 笔记本电脑和台式电脑发送消息时,此特殊属性是必需的。发送到 iOS 设备(如 iPhones 和)不需要这样做iPads。

要向 Safari web 浏览器发送消息,必须指定原始消息有效负载。原始消息有效负载必须在 aps 对象中包含一个 url-args 数组。要向 Safari web 浏览器发送推送通知,该 url-args 数组是必需的。但是,数组中包含单个空元素是可以接受的。

以下示例使用发送消息向 S afari 网络浏览器发送通知。 AWS CLI Replace(替换) token 使用设备的唯一令牌和 611e3e3cdd47474c9c1399a50example 使用您的应用程序标识符。

aws pinpoint send-messages \ --application-id 611e3e3cdd47474c9c1399a50example \ --message-request '{ "Addresses": { "token": { "ChannelType":"APNS" } }, "MessageConfiguration": { "APNSMessage": { "RawContent": "{\"aps\": {\"alert\": { \"title\": \"Title of my message\", \"body\": \"This is a push notification for the Safari web browser.\"},\"content-available\": 1,\"url-args\": [\"\"]}}" } } }' \ --region us-east-1

有关 Safari 推送通知的更多信息,请参阅 Apple 开发者网站上的配置 Safari 推送通知

APNS (AWS CLI)

以下示例使用发送消息通过发送消息发送APNS推送通知。 AWS CLI Replace(替换) token 使用设备的唯一令牌,611e3e3cdd47474c9c1399a50example 使用您的应用程序标识符,以及 GAME_INVITATION 带有唯一标识符。

aws pinpoint send-messages \ --application-id 611e3e3cdd47474c9c1399a50example \ --message-request '{ "Addresses": { "token": { "ChannelType":"APNS" } }, "MessageConfiguration": { "APNSMessage": { "RawContent": "{\"aps\" : {\"alert\" : {\"title\" : \"Game Request\",\"subtitle\" : \"Five Card Draw\",\"body\" : \"Bob wants to play poker\"},\"category\" : \"GAME_INVITATION\"},\"gameID\" : \"12345678\"}" } } }' \ --region us-east-1
JavaScript (Node.js)

使用此示例 JavaScript 在 Node.js 中使用 for 发送推送通知。 AWS SDK此示例假设您已经 JavaScript 在 Node.js 中安装并配置了。SDK

此示例还假定您正在使用共享凭证文件来指定现有 用户的访问密钥和私密访问密钥。有关更多信息,请参阅 Node.js 开发人员指南 JavaScript 中的设置凭证。AWS SDK

'use strict'; const AWS = require('aws-sdk'); // The AWS Region that you want to use to send the message. For a list of // AWS Regions where the API is available const region = 'us-east-1'; // The title that appears at the top of the push notification. var title = 'Test message sent from End User Messaging Push.'; // The content of the push notification. var message = 'This is a sample message sent from End User Messaging Push by using the ' + 'AWS SDK for JavaScript in Node.js'; // The application ID that you want to use when you send this // message. Make sure that the push channel is enabled for the project that // you choose. var applicationId = 'ce796be37f32f178af652b26eexample'; // An object that contains the unique token of the device that you want to send // the message to, and the push service that you want to use to send the message. var recipient = { 'token': 'a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d8e9f0', 'service': 'GCM' }; // The action that should occur when the recipient taps the message. Possible // values are OPEN_APP (opens the app or brings it to the foreground), // DEEP_LINK (opens the app to a specific page or interface), or URL (opens a // specific URL in the device's web browser.) var action = 'URL'; // This value is only required if you use the URL action. This variable contains // the URL that opens in the recipient's web browser. var url = 'https://www.example.com'; // The priority of the push notification. If the value is 'normal', then the // delivery of the message is optimized for battery usage on the recipient's // device, and could be delayed. If the value is 'high', then the notification is // sent immediately, and might wake a sleeping device. var priority = 'normal'; // The amount of time, in seconds, that the push notification service provider // (such as FCM or APNS) should attempt to deliver the message before dropping // it. Not all providers allow you specify a TTL value. var ttl = 30; // Boolean that specifies whether the notification is sent as a silent // notification (a notification that doesn't display on the recipient's device). var silent = false; function CreateMessageRequest() { var token = recipient['token']; var service = recipient['service']; if (service == 'GCM') { var messageRequest = { 'Addresses': { [token]: { 'ChannelType' : 'GCM' } }, 'MessageConfiguration': { 'GCMMessage': { 'Action': action, 'Body': message, 'Priority': priority, 'SilentPush': silent, 'Title': title, 'TimeToLive': ttl, 'Url': url } } }; } else if (service == 'APNS') { var messageRequest = { 'Addresses': { [token]: { 'ChannelType' : 'APNS' } }, 'MessageConfiguration': { 'APNSMessage': { 'Action': action, 'Body': message, 'Priority': priority, 'SilentPush': silent, 'Title': title, 'TimeToLive': ttl, 'Url': url } } }; } else if (service == 'BAIDU') { var messageRequest = { 'Addresses': { [token]: { 'ChannelType' : 'BAIDU' } }, 'MessageConfiguration': { 'BaiduMessage': { 'Action': action, 'Body': message, 'SilentPush': silent, 'Title': title, 'TimeToLive': ttl, 'Url': url } } }; } else if (service == 'ADM') { var messageRequest = { 'Addresses': { [token]: { 'ChannelType' : 'ADM' } }, 'MessageConfiguration': { 'ADMMessage': { 'Action': action, 'Body': message, 'SilentPush': silent, 'Title': title, 'Url': url } } }; } return messageRequest } function ShowOutput(data){ if (data["MessageResponse"]["Result"][recipient["token"]]["DeliveryStatus"] == "SUCCESSFUL") { var status = "Message sent! Response information: "; } else { var status = "The message wasn't sent. Response information: "; } console.log(status); console.dir(data, { depth: null }); } function SendMessage() { var token = recipient['token']; var service = recipient['service']; var messageRequest = CreateMessageRequest(); // Specify that you're using a shared credentials file, and specify the // IAM profile to use. var credentials = new AWS.SharedIniFileCredentials({ profile: 'default' }); AWS.config.credentials = credentials; // Specify the AWS Region to use. AWS.config.update({ region: region }); //Create a new Pinpoint object. var pinpoint = new AWS.Pinpoint(); var params = { "ApplicationId": applicationId, "MessageRequest": messageRequest }; // Try to send the message. pinpoint.sendMessages(params, function(err, data) { if (err) console.log(err); else ShowOutput(data); }); } SendMessage()
Python

参考此示例,通过使用 AWS SDK for Python (Boto3)发送推送通知。此示例假设你已经安装并配置了 Python (Boto3) 的。SDK

此示例还假定您正在使用共享凭证文件来指定现有 用户的访问密钥和私密访问密钥。有关更多信息,请参阅 Python (Boto3) API 参考中的凭证。AWS SDK

import json import boto3 from botocore.exceptions import ClientError # The AWS Region that you want to use to send the message. For a list of # AWS Regions where the API is available region = "us-east-1" # The title that appears at the top of the push notification. title = "Test message sent from End User Messaging Push." # The content of the push notification. message = ("This is a sample message sent from End User Messaging Push by using the " "AWS SDK for Python (Boto3).") # The application ID to use when you send this message. # Make sure that the push channel is enabled for the project or application # that you choose. application_id = "ce796be37f32f178af652b26eexample" # A dictionary that contains the unique token of the device that you want to send the # message to, and the push service that you want to use to send the message. recipient = { "token": "a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d8e9f0", "service": "GCM" } # The action that should occur when the recipient taps the message. Possible # values are OPEN_APP (opens the app or brings it to the foreground), # DEEP_LINK (opens the app to a specific page or interface), or URL (opens a # specific URL in the device's web browser.) action = "URL" # This value is only required if you use the URL action. This variable contains # the URL that opens in the recipient's web browser. url = "https://www.example.com" # The priority of the push notification. If the value is 'normal', then the # delivery of the message is optimized for battery usage on the recipient's # device, and could be delayed. If the value is 'high', then the notification is # sent immediately, and might wake a sleeping device. priority = "normal" # The amount of time, in seconds, that the push notification service provider # (such as FCM or APNS) should attempt to deliver the message before dropping # it. Not all providers allow you specify a TTL value. ttl = 30 # Boolean that specifies whether the notification is sent as a silent # notification (a notification that doesn't display on the recipient's device). silent = False # Set the MessageType based on the values in the recipient variable. def create_message_request(): token = recipient["token"] service = recipient["service"] if service == "GCM": message_request = { 'Addresses': { token: { 'ChannelType': 'GCM' } }, 'MessageConfiguration': { 'GCMMessage': { 'Action': action, 'Body': message, 'Priority' : priority, 'SilentPush': silent, 'Title': title, 'TimeToLive': ttl, 'Url': url } } } elif service == "APNS": message_request = { 'Addresses': { token: { 'ChannelType': 'APNS' } }, 'MessageConfiguration': { 'APNSMessage': { 'Action': action, 'Body': message, 'Priority' : priority, 'SilentPush': silent, 'Title': title, 'TimeToLive': ttl, 'Url': url } } } elif service == "BAIDU": message_request = { 'Addresses': { token: { 'ChannelType': 'BAIDU' } }, 'MessageConfiguration': { 'BaiduMessage': { 'Action': action, 'Body': message, 'SilentPush': silent, 'Title': title, 'TimeToLive': ttl, 'Url': url } } } elif service == "ADM": message_request = { 'Addresses': { token: { 'ChannelType': 'ADM' } }, 'MessageConfiguration': { 'ADMMessage': { 'Action': action, 'Body': message, 'SilentPush': silent, 'Title': title, 'Url': url } } } else: message_request = None return message_request # Show a success or failure message, and provide the response from the API. def show_output(response): if response['MessageResponse']['Result'][recipient["token"]]['DeliveryStatus'] == "SUCCESSFUL": status = "Message sent! Response information:\n" else: status = "The message wasn't sent. Response information:\n" print(status, json.dumps(response,indent=4)) # Send the message through the appropriate channel. def send_message(): token = recipient["token"] service = recipient["service"] message_request = create_message_request() client = boto3.client('pinpoint',region_name=region) try: response = client.send_messages( ApplicationId=application_id, MessageRequest=message_request ) except ClientError as e: print(e.response['Error']['Message']) else: show_output(response) send_message()

其他 资源