Amazon SNS: JSON тосты для телефонов Windows
Когда я использую консоль Amazon SNS для отправки всплывающих сообщений на устройство Windows Phone 8 (т.е. с системой MPNS), я могу отправлять сообщения только в текстовом формате. Выбор "Использовать специфичные для платформы словари сообщений JSON" и отправка тоста JSON никогда не доходят до устройства. Сообщение по умолчанию, которое вы видите, когда выбираете формат, специфичный для платформы, - это сообщение уведомления плитки, и оно работает.
Например, следующее сообщение не выдает ошибку и не отображается на устройстве:
{
"MPNS": "<?xml version=\"1.0\" encoding=\"utf-8\"?><wp:Notification xmlns:wp=\"WPNotification\"><wp:Toast><wp:Text1>Amazon</wp:Text1><wp:Text2>hooray</wp:Text2><wp:Param>this_is/my?extra=parameter</wp:Param></wp:Toast></wp:Notification>"
}
Это было протестировано на нескольких устройствах: Lumia 620 с Windows Phone 8.0 и Lumia 1020 с 8.1 бета. Я также пытался отправлять сообщения из бэкэнда Java, но он просто отображается в виде необработанного текста JSON ({ "MPNS": ...
) снова. Что может быть не так? JSON действителен, XML правильно сформирован... Я в растерянности.
1 ответ
Я недавно столкнулся с той же проблемой, и нашел решение. Документация SNS для MPNS не подчеркивает важный шаг, но его можно найти в примере кода и, в конечном итоге, в разделе атрибутов сообщения в документации.
Вы должны установить два специфичных для MPNS MessageAttributes в PublishRequest. Отказ от них приведет к сбою доставки, и не останется никаких улик для расследования: т.е. даже если вы включите журналы состояния доставки с помощью CloudWatch, providerResponse
будет отсутствовать.
Для справки, следующие атрибуты:
Имя атрибута:
AWS.SNS.MOBILE.MPNS.Type
Возможные значения:token
(для уведомлений плитки),toast
или жеraw
Имя атрибута:
AWS.SNS.MOBILE.MPNS.NotificationClass
Возможные значения:realtime
*,priority
,regular
(в режиме реального времени работал для меня)
Тем не менее, кажется, что невозможно отправить пользовательский контент в MPNS с помощью консоли SNS. Но использование API работает, поэтому вот выдержка из примера Java для использования Java SDK:
AmazonSNS snsClient = ... /* initialise the client */;
Map<String, MessageAttributeValue> notificationAttributes = new HashMap<String, MessageAttributeValue>();
notificationAttributes.put("AWS.SNS.MOBILE.MPNS.Type",
new MessageAttributeValue()
.withDataType("String")
.withStringValue("token")); // or "toast" or "raw", depending on the payload
notificationAttributes.put("AWS.SNS.MOBILE.MPNS.NotificationClass",
new MessageAttributeValue()
.withDataType("String")
.withStringValue("realtime"));
PublishRequest request = new PublishRequest();
request.setMessageAttributes(notificationAttributes);
request.setMessageStructure("json");
request.setTargetArn(... /* topic or endpoint ARN */);
request.setMessage(... /* JSON payload */)
snsClient.publish(request);