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 будет отсутствовать.

Для справки, следующие атрибуты:

  1. Имя атрибута: AWS.SNS.MOBILE.MPNS.Type
    Возможные значения: token (для уведомлений плитки), toast или же raw

  2. Имя атрибута: 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);
Другие вопросы по тегам