Как использовать Pinpoint для отправки сообщений на определенные устройства с помощью Java AWS SDK для Pinpoint

Мне удалось настроить мобильное приложение для Android на получение сообщений, созданных с помощью консоли Pinpoint Campaign (https://console.aws.amazon.com/pinpoint/home) на конкретное устройство, нацелив сегмент на настраиваемый атрибут, который есть только на этом устройстве.

Конфигурация кампании Pinpoint

  • Мобильный push-канал
  • Стандартная кампания
  • Сегмент определен с использованием настраиваемых атрибутов, задержка 0%
  • Беззвучное уведомление
  • Пользовательский JSON
  • Запустить немедленно

Теперь я хотел бы реализовать эту функцию в своем приложении Java, используя API SDK, и нацелить на конечную точку Pinpoint устройства.

GetEndpointRequest getEndpointRequest = new GetEndpointRequest()
   .withApplicationId(appId)
   .withEndpointId(endpointId);
GetEndpointResult endpointResult = getAmazonPinpointClient().getEndpoint(getEndpointRequest);

DirectMessageConfiguration directMessageConfiguration =
  new DirectMessageConfiguration().withGCMMessage(new GCMMessage().withBody(body).withSilentPush(true).withAction(Action.OPEN_APP));
AddressConfiguration addressConfiguration = new AddressConfiguration().withChannelType(ChannelType.GCM);

MessageRequest messageRequest = new MessageRequest().withMessageConfiguration(directMessageConfiguration)
   .addAddressesEntry(endpointResponse.getAddress(), addressConfiguration);

SendMessagesRequest sendMessagesRequest = new SendMessagesRequest()
   .withApplicationId(appId)
   .withMessageRequest(messageRequest);

«Тело» - это тот же самый JSON, который я вставил в консоль Pinpoint Campaign. Когда я запускаю это, я возвращаю DeliveryStatus УСПЕШНО, но устройство никогда не получает сообщение.

{ApplicationId: MY_APP_ID,Result: {clrVUcv-AwA:APA91bHGXkxpDJiw5kOMROA2XTJXuKreMklq9jemHO_KGYTIw6w84Fw9zLv9waMgLgha61IR-kZxgmrnFu-OGp8l6WFgp4Wolh4oOvZwMobGYNgzivv3bGIK83t-e4hiLx1TTaEIeRdQ={DeliveryStatus: SUCCESSFUL,StatusCode: 200,StatusMessage: {"multicast_id":4803589342422496921,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1515105369948916%c551fa42f9fd7ecd"}]},}}}

Я также пробовал это через интерфейс командной строки AWS:

aws pinpoint send-messages --application-id MY_APP_ID --message-request "{\"Addresses\":{\"clrVUcv-AwA:APA91bHGXkxpDJiw5kOMROA2XTJXuKreMklq9jemHO_KGYTIw6w84Fw9zLv9waMgLgha61IR-kZxgmrnFu-OGp8l6WFgp4Wolh4oOvZwMobGYNgzivv3bGIK83t-e4hiLx1TTaEIeRdQ\":{\"ChannelType\":\"GCM\"}},\"MessageConfiguration\":{\"GCMMessage\":{\"Body\":\"{\\\"message\\\":\\\"stuff\\\"}\",\"SilentPush\":true}}}"

с аналогичным результатом (получите код состояния 200 и DeliveryStatus УСПЕШНО, но приложение никогда не получит). Я попытался использовать «Прямое» сообщение в консоли AWS Pinpoint, но похоже, что они не поддерживают тот же формат (принудительное действие и заголовок / сообщение вместо тихого push-сообщения с настраиваемым JSON).

Я неправильно получаю конечную точку? Как перевести указанную выше кампанию в сообщение? Я вижу, что есть вызов API sendUserMessages (), но это не кажется правильным (я не смог найти, где указать конкретную конечную точку пользователя)?

Клиент получает кампанию через зарегистрированный Сервис:

public class PushListenerService extends GcmListenerService {

@Override
public void onMessageReceived(final String from, final Bundle data) {
    AWSMobileClient.initializeMobileClientIfNecessary(this.getApplicationContext());
    final NotificationClient notificationClient = AWSMobileClient.defaultMobileClient()
            .getPinpointManager().getNotificationClient();

    NotificationClient.CampaignPushResult pushResult =
            notificationClient.handleGCMCampaignPush(from, data, this.getClass());


    Log.e(LOG_TAG, " onMessageReceived - got messages"  + data);

Отправляются ли прямые сообщения GCM с помощью одного и того же метода кампании или мне нужно регистрировать другую службу для их обработки?


person Mark B    schedule 04.01.2018    source источник
comment
Мне удалось использовать параметр «Прямое сообщение» в веб-консоли AWS для нацеливания сообщения на устройство с использованием идентификатора конечной точки, но я до сих пор не понял, как перевести это в интерфейс командной строки AWS или SDK AWS для Pinpoint.   -  person Mark B    schedule 05.01.2018
comment
Мне удалось продублировать это с помощью интерфейса командной строки AWS, используя следующую команду: aws pinpoint send-messages --application-id MY_APP_ID --message-request "{\"Context\":{},\"MessageConfiguration\":{\"DefaultMessage\":{\"Body\":\"Test from default message\",\"Substitutions\":{}},\"DefaultPushNotificationMessage\":{},\"APNSMessage\":{},\"GCMMessage\":{\"Data\":{\"message\":\"test\"},\"SilentPush\":true},\"BaiduMessage\":{},\"ADMMessage\":{},\"SMSMessage\":{}},\"Addresses\":{\"MY_ENDPOINT_ID\":{\"ChannelType\":\"GCM\"}},\"Endpoints\":{}}"   -  person Mark B    schedule 05.01.2018


Ответы (1)


Нашел решение, основанное на команде AWS CLI, которую мне удалось запустить. Должен был использоваться элемент «Данные», а не «Тело», и нужно было включить «SilentPush».

EndpointResponse endpointResponse = getPinpointEndpointResponse(appId, pinpointEndpointId);

Map<String, String> data = new HashMap<>();
// construct data here, currently only supports Map<String, String>
// why not HashMap<String, Object> so it can support full JSON????

DirectMessageConfiguration directMessageConfiguration =
    new DirectMessageConfiguration().withGCMMessage(new GCMMessage().withData(data).withSilentPush(true));

AddressConfiguration addressConfiguration = new AddressConfiguration().withChannelType(ChannelType.GCM);

MessageRequest messageRequest = new MessageRequest().withMessageConfiguration(directMessageConfiguration)
    .addAddressesEntry(endpointResponse.getAddress(), addressConfiguration);

SendMessagesRequest sendMessagesRequest = new SendMessagesRequest()
    .withApplicationId(appId)
    .withMessageRequest(messageRequest);
person Mark B    schedule 05.01.2018
comment
Где вы взяли документацию по этому коду? У вас есть ссылка, которой вы могли бы поделиться? - person Joe; 27.11.2018
comment
Документация была скудной, я пытался выяснить, как ее настроить, из документации AWS Java SDK docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ и другие примеры (например, forum.aws.amazon.com/thread.jspa?threadID=282165) - person Mark B; 28.11.2018