Отправка пользовательских сообщений на устройства в пакете через APNS - PullRequest
2 голосов
/ 29 ноября 2011

Я использую notnoop APNS Java-библиотеку для отправки уведомлений APNS. Поскольку у нас большое количество пользователей, нам нужно отправлять уведомления APNS в пакетном режиме. В соответствии с API-интерфейсом notnoop наилучшим выбором является следующий метод:

push(Collection<String> deviceTokens, String payload)

http://notnoop.github.com/java-apns/apidocs/com/notnoop/apns/ApnsService.html

Этот метод отправляет одно сообщение нескольким устройствам в пакете. Мы хотим отправить разные конкретные сообщения для каждого устройства, но все равно отправлять все уведомления в пакете. Я не нашел подходящих методов в библиотеке notnoop, чтобы сделать это. У кого-нибудь есть опыт по этому поводу? Возможно ли это сделать с помощью библиотеки notnoop? Поддерживает ли сервер Apple APNS этот тип проталкивания?

Заранее спасибо!

Best, J

1 Ответ

5 голосов
/ 22 февраля 2012

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

Объявите ваш ApnsService как пул потоков, чтобы пуш выполнялся быстро

    ApnsService service = null;

        service = APNS.newService()
                .withCert(certificatePath, certificatePassword)
                .withProductionDestination()
                .asPool(threadCount)
                .build();


        service.start();

Создайте базу полезной нагрузки вне итерации вашего устройства

        PayloadBuilder payloadBuilder = APNS.newPayload();

        payloadBuilder = payloadBuilder
                .alertBody("yourMessage")
                .sound("default"));

Перебирайте устройства и добавляйте пользовательское сообщение или параметры

        for (ApnsDevice apnsDevice : apnsDeviceList) {
            try {
                PayloadBuilder perDevicePayloadBuilder = payloadBuilder.copy()
                        .badge(apnsDevice.getBadgeCount()+1);

                // check if the message is too long (it won't be sent if it is)
                //and trim it if it is.
                if (perDevicePayloadBuilder.isTooLong()) {
                    logger.warn("Payload is too long, shrinking it");
                    perDevicePayloadBuilder = perDevicePayloadBuilder.shrinkBody();
                }

                String token = apnsDevice.getDeviceToken();

                service.push(token, perDevicePayloadBuilder.build());

            } catch (Exception ex) {
               logger.error("Error while pushing apns alerts", ex);
            }
        } 
...