Полезная нагрузка Google Cloud Messaging с данными приложений с помощью Azure Notification Hub

Я пытаюсь отправить уведомление из моего внутреннего приложения на мобильные телефоны Android. Мне удалось установить устройства и удалить их. Теперь у меня проблемы с полезной нагрузкой сообщения. Мне нужно звуковое оповещение, и мне нужно отправить некоторые данные приложения в сообщении. Вот как я создаю полезную нагрузку сейчас, но я думаю, что это не очень хорошо:

string notificationText = NotificationText(story, profile);

JProperty messageJProperty = new JProperty("message", notificationText);
JObject messageJObject = new JObject(messageJProperty);
JProperty objectJProperty = new JProperty("data", messageJObject);
JObject message = new JObject(objectJProperty);
var payload = message.ToString();

return payload;

спасибо

обновление (3 ноября 2017 г.): я обнаружил, что этот формат полезной нагрузки будет принят Azure:

private string Payload(string notificationText, StoryEntity story, ProfileEntity profile, string deviceToken)
{
        var payload = new JObject
        (
            new JProperty("registration_ids", new JArray(deviceToken)),
            new JProperty("data", new JObject(
                                              new JProperty("title", "Mapporia has new stroy>"),
                                              new JProperty("message", notificationText)
                                              )),
            new JProperty("notId", $"{new Random().Next(int.MaxValue)}"),
            new JProperty("content-available", 1),
            new JProperty("soundname", "default"),
            new JProperty("image", @"www/assets/img/logo.png"),
            new JProperty("image-type", "circle"),
            new JProperty("style", "inbox"),
            new JProperty("notData", new JObject(
                                                   new JProperty("storyId", story.Id),
                                                   new JProperty("profileId", profile.Id)
                                                 ))
        ).ToString(Newtonsoft.Json.Formatting.None);

        return payload;
    }

Вот как выглядит мой json:

введите здесь описание изображения

Но теперь Azure выдает исключение:

1 11 ноября 2017 г. Создать историю: Удаленный сервер вернул ошибку: (400) Неверный запрос. Предоставленная полезная нагрузка уведомления недействительна.

Я что-то пропустил? Судя по этой странице, я построил ее неправильно!


person Wasyster    schedule 25.10.2017    source источник


Ответы (3)


Правильный формат JSON для GCM:

    {
        "to" : "{{devicetoken}} OR {{registrationID form Azure}}",
        "data":
            {
                "title":"{{title goes here}}",
                "message":"{{message body goes here}}",
                "priority":"high"
            },
        "notId":"{{unique ID, I used RANDOM to generate it}}",
        "content-available":1,
        "soundname":"default",
        "image":"www/assets/img/logo.png",
        "image-type":"circle",
        "style":"inbox",
        "notData":
            {
                "storyId":1,
                "profileId":6
            }
    }

И как создать этот JSON с помощью С# с пакетом Newtonsoft JSON nuget:

            var payload = new JObject
            (
                new JProperty("to", deviceToken),
                new JProperty("data", new JObject(
                                                  new JProperty("title", "title goes here"),
                                                  new JProperty("message", "notification text goes here"),
                                                  new JProperty("priority", "high")
                                                  )),
                new JProperty("notId", $"{new Random().Next(int.MaxValue)}"),
                new JProperty("content-available", 1),
                new JProperty("soundname", "default"),
                new JProperty("image", @"www/assets/img/logo.png"),
                new JProperty("image-type", "circle"),
                new JProperty("style", "inbox"),
                new JProperty("notData", new JObject(
                                                       new JProperty("storyId", story.Id),
                                                       new JProperty("profileId", profile.Id)
                                                     ))
            ).ToString(Newtonsoft.Json.Formatting.None);
person Wasyster    schedule 02.11.2017

Вот как я сейчас строю полезную нагрузку, но я думаю, что это нехорошо

Если вы правильно поняли и если структура json исправлена, мы могли бы сериализовать объект для этого. Ниже приведен демонстрационный код:

string notificationText = NotificationText(story, profile);

TestData testData = new TestData { Data = new Data { Message = notificationText }};
        
var payload = JsonConvert.SerializeObject(testData).ToLowerInvariant();


 public class TestData
 {
       public Data Data;
 }

 public class Data
 {
      public string Message;
 }

Обновлено:

Сообщение GCM может содержать до 4 КБ полезной нагрузки для клиентского приложения, мы можем получить больше информации о сообщении GCM из этого tutorial. Ограничение составляет 4 КБ и не может быть больше. Если вам нужно отправить звук, я предлагаю отправить собственный json с сообщением, указывающим на URL-адрес, содержащий двоичные данные.

Google Cloud Messaging (GCM) — это бесплатная служба, которая позволяет разработчикам отправлять сообщения между серверами и клиентскими приложениями. Сюда входят нисходящие сообщения от серверов к клиентским приложениям и восходящие сообщения от клиентских приложений к серверам.

Например, упрощенное нисходящее сообщение может информировать клиентское приложение о том, что с сервера нужно получить новые данные, как в случае нового уведомления по электронной почте. В таких случаях использования, как обмен мгновенными сообщениями, сообщение GCM может передавать до 4 КБ полезной нагрузки в клиентское приложение. Служба GCM обрабатывает все аспекты постановки сообщений в очередь и их доставки в целевое клиентское приложение и из него.

person Tom Sun - MSFT    schedule 26.10.2017
comment
Проблема заключается в формате полезной нагрузки, а не в том, как ее физически построить. - person Wasyster; 26.10.2017
comment
Я обновил ответ. Более подробную информацию см. в разделе Обновлено. - person Tom Sun - MSFT; 27.10.2017
comment
Thnx, я получил эту часть как. Я хочу знать, как отправлять данные приложения в уведомлении, как включить звук. - person Wasyster; 27.10.2017

Вы можете упростить полезную нагрузку для этого вызова

 var payload = new JObject(
                      new JProperty("data", new JObject(
                      new JProperty("message", notificationText))))
                      .ToString(Newtonsoft.Json.Formatting.None);

На выходе будут полезные данные в формате JSON, поскольку GCM их принимает.

{"data":{"message":"your notification Text"}}

В этом решении я использовал сериализатор JSON от Newtonsoft для сериализации моего JObject.

person athina.bikaki    schedule 27.10.2017