Используйте сервис Apple Push Notification через Java - PullRequest
8 голосов
/ 31 августа 2009

Я пытаюсь реализовать программу Java, которая отправляет push-уведомление Apple в клиентское приложение iPhone ... Найдена следующая библиотека: APNs Java

Код провайдера:

Создан следующий код (из Javapns) для использования в моем приложении:

try {
    PayLoad payLoad = new PayLoad();

    payLoad.addAlert("My alert message");
    payLoad.addBadge(45);
    payLoad.addSound("default");

    PushNotificationManager pushManager = PushNotificationManager.getInstance();
    pushManager.addDevice("iPhone", "f4201f5d8278fe39545349d0868a24a3b60ed732");
    log.warn("Initializing connectiong with APNS...");

    // Connect to APNs
    pushManager.initializeConnection(HOST, PORT, 
                                 "/etc/Certificates.p12", "password", 
    SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);

    Device client = pushManager.getDevice("Lambo");

    // Send Push
    log.warn("Sending push notification...");
    PushNotificationManager.getInstance().sendNotification(client, payLoad);
 }
 catch (Exception e) {
    throw new ApnsPushNotificationException("Unable to send push " + e);
 }

Когда я запускаю это приложение (как вы можете видеть из операторов Log4j), исключений не возникает:

  WARN  [MyCode] Initializing connectiong with APNS...
  WARN  [MyCode] Sending push notification...

Но мое клиентское приложение не получает никаких уведомлений!

Процесс регистрации IDPP:

Кроме того, на портале программ для разработчиков iPhone (IDPP):

  • Создан сертификат и ключи SSL на основе APNS

  • Создан и установлен профиль обеспечения

  • Установлен сертификат SSL и ключ на сервере.

Несколько раз перечитал Руководство по обслуживанию push-уведомлений Apple и заметил несколько вещей:

(1) На странице 15 говорится, что токен устройства не совпадает с UDID устройства (который я в настоящее время неправильно передаю как второй параметр в методе PushNotificationManager.addDevice () (см. Выше)).

На странице 17 говорится:

"APN генерирует токен устройства, используя информацию, содержащуюся в уникальном сертификате устройства. Токен устройства содержит идентификатор устройства. Затем он шифрует токен устройства с помощью ключа токена и возвращает его на устройство. Устройство возвращает устройство. токен запрашивающему приложению как объект NSData. Затем приложение должно доставить токен устройства своему поставщику в двоичном или шестнадцатеричном формате. "

Внедрение клиента iPhone OS

(2) После прочтения страниц 33 - 34 я обнаружил, что не включил код Objective-C, чтобы приложение регистрировалось в APN.

Я не разработчик Objective-C, поэтому я могу восстановить код устройства или получить его из сертификата?

Где я могу получить токен устройства (извините, кто-то еще написал клиентское приложение Objective-C, а я являюсь Java-разработчиком)?

Вопрос (ы):

(1) За исключением незнания, где взять токен устройства и регистрации кода мобильного клиента, есть ли что-то еще, что я не просмотрел или пропустил?

(2) Правильно ли я использую библиотеку Javapns?

Спасибо, что нашли время, чтобы прочитать это ...

Ответы [ 6 ]

18 голосов
/ 26 ноября 2009

В качестве позорной саморекламы я рекомендую использовать библиотеку java-apns. Ваш код будет выглядеть так:

ApnsService service =
     APNS.newService()
     .withCert("/etc/Certificates.p12", "password")
     .withSandboxDestination() // or .withProductionDestination()
     .build();

String payload =
    APNS.newPayload()
    .alertBody("My alert message")
    .badge(45)
    .sound("default")
    .build();

String deviceToken = "f4201f5d8278fe39545349d0868a24a3b60ed732";

log.warn("Sending push notification...");
service.push(deviceToken, payload);
8 голосов
/ 09 октября 2009

Небольшой совет, чтобы преобразовать полученный токен в формат, подходящий для регистрации в javapns, этот код поможет:

- (NSString *)convertTokenToDeviceID:(NSData *)token {
NSMutableString *deviceID = [NSMutableString string];

// iterate through the bytes and convert to hex
unsigned char *ptr = (unsigned char *)[token bytes];

for (NSInteger i=0; i < 32; ++i) {
    [deviceID appendString:[NSString stringWithFormat:@"%02x", ptr[i]]];
}

return deviceID;

}

1 голос
/ 25 июля 2011

Я пытался это сделать, и я постоянно зависал при отправке уведомления, и ничего не отправлялось.

Проблема связана со следующей функцией:

         public void sendNotification(Device device, PayLoad payload) 

Похоже, что буферизованный читатель имеет NULL

           BufferedReader in = 
           new BufferedReader(new InputStreamReader(this.socket.getInputStream() ) );

Поэтому, когда эта часть кода попадает в исходное состояние, она просто висит в бесконечном цикле

  logger.debug( "In: [" + in.readLine() + "]" );

Этот вывод равен [null]

Итак, сразу после этого выполняются циклы:

      while ( ! this.socket.isInputShutdown() ) {
          while( in.ready() ) {
              logger.debug("ready now");
              logger.debug(in.readLine());
              System.out.println( this.socket.getInputStream().read() );
          }
      }

Код входит в первый цикл while и ожидает готовности BufferedReader, чтобы быть готовым и просто продолжает ждать ..... объявление, это ваша повешение

1 голос
/ 31 августа 2009
  1. Ваш код Java выглядит солидно!Однако не забудьте закрыть соединение через PushNotificationManager.closeConnection().Важно убирать за собой.

    В качестве дополнительного комментария я заметил, что вы добавляете устройство «iPhone», но потом запрашиваете «Lambo».Это признак ошибки.

  2. Указанный в коде токен устройства неверен.Токены устройства, в настоящее время, как 32-битное длинное значение, которое разбивается на 64 символа.Я предполагаю, что сервер молча завершает работу при отправке уведомления на недействительный токен!

  3. Единственный способ получить токен устройства - из самого приложения.Согласно руководству Push Notification приложение iPhone должно зарегистрироваться для уведомления при запуске.В application:didRegisterForRemoteNotificationsWithDeviceToken: iPhone необходимо отправить токен устройства на сервер поставщика Java.(В целях отладки вы можете просто NSLog токен устройства и использовать его; он никогда не меняется при каждом запуске).

    Я бы порекомендовал вам создать сервер на сервере поставщика Java для получения токенов устройства.Установите ServerSocket для получения подключений от iPhone и их токена устройства (и любой дополнительной информации, которая вам нужна) и вставьте токены в базу данных.

0 голосов
/ 11 октября 2011

JavaPNS недавно была обновлена ​​до 2.0, и исправлены ВСЕ сообщенные проблемы до даты выпуска. Это решает проблему, которую вы описываете, и использование библиотеки НАМНОГО проще, чем когда-либо было (вы можете отправить уведомление одной строкой кода).

0 голосов
/ 31 августа 2009

Вы, кажется, пропускаете токен

pushManager.addDevice("iPhone", "f4201f5d8278fe39545349d0868a24a3b60ed732");

Принимает идентификатор и проверку токена:

https://github.com/o-sam-o/javapns/blob/master/src/javapns/notification/PushNotificationManager.java#L501

Единственный способ получить токен из приложения iphone. Действительный токен выглядит примерно так: 1d2d6f34 c5028bca c50df5f9 1992c912 ce7deae8 3bbe7da5 447f6a68 cfecdc0e

...