Pregunta

Estoy tratando de implementar un programa Java que envía una notificación push de Apple a una aplicación cliente de iPhone ... Se encuentra la biblioteca siguiente: Java APN

Código de proveedor:

Creado el siguiente código (de Javapns) para utilizar en mi aplicación:

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);
 }

Al ejecutar esta aplicación (como se puede ver a través de las declaraciones Log4j) no hay excepciones que se producen:

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

Pero mi aplicación cliente no recibe ninguna notificación!

IDPP Proceso de Registro:

Además, hizo lo siguiente en el iPhone Developer Program Portal (IDPP):

  • Creado el certificado y las claves SSL basada APN

  • Creado e instalado el archivo de suministro

  • instalado el certificado SSL y su clave en el servidor.

He leído sobre la manzana de notificación Push Guía de servicio varias veces y se dio cuenta algunas cosas:

(1) En la página 15, se afirma que el token de dispositivo no es el mismo que el UDID dispositivo (que actualmente estoy incorrectamente pasando en como el segundo parámetro dentro del método PushNotificationManager.addDevice () (véase más arriba)).

En la página 17, que establece lo siguiente:

"APNs genera un contador dispositivo usando la información contenida en el certificado de dispositivo único. El token dispositivo contiene un identificador del dispositivo. A continuación, encripta el token de dispositivo con una llave ficha y lo devuelve al dispositivo. El dispositivo devuelve el dispositivo de contadores a la aplicación solicitante como un objeto NSData. continuación, la aplicación debe entregar el token de dispositivo a su proveedor, ya sea en formato binario o hexadecimal ".

iPhone OS implementación del cliente

(2) Después de leer las páginas 33 - 34, descubrí que no incluía el código Objective-C para tener el registro de aplicación con APNs

.

No soy un desarrollador de Objective-C, por lo que es aquí donde puedo recuperar el código de dispositivo o tengo que conseguirlo a partir del certificado?

¿Dónde puedo obtener el token de dispositivo (lo siento, alguien escribió la aplicación cliente de Objective-C y yo soy un desarrollador de Java)?

Pregunta (s):

(1) Con la excepción de no saber dónde obtener el dispositivo token y el registro del código de cliente móvil, ¿hay algo más que no he mirado por encima o perdido?

(2) Estoy usando la biblioteca Javapns de la manera correcta?

Gracias por tomarse el tiempo para leer esto ...

¿Fue útil?

Solución

Sólo un pequeño consejo, con el fin de convertir su distintivo recibido en un formato adecuado para el registro en javapns, este código hará el truco:

- (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;

}

Otros consejos

Como un auto-publicidad vergonzosa, le animo a utilizar java-apns biblioteca . Su código se verá así:

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);
  1. Su código Java tiene un aspecto sólido! Sin embargo, no se olvide de cerrar la conexión, a través de PushNotificationManager.closeConnection(). Es importante la limpieza después de ti mismo.

    Como comentario al margen, noto que está agregando el dispositivo 'iPhone', pero las consultas a 'Lambo' después. Esto es una indicación de un error.

  2. El token dispositivo mostrado en el código es incorrecto. tokens de dispositivo, en la actualidad, como valor de largo de 32 bits, que consigue hexed en 64 caracteres. Asumo que el servidor está fallando en silencio cuando se empuja la notificación a invalid token!

  3. La única manera de obtener el token dispositivo es desde la propia aplicación. Según lo previsto por la guía push Notification indica, la aplicación para el iPhone necesita registrarse para recibir notificación al iniciarse. En el application:didRegisterForRemoteNotificationsWithDeviceToken: , el iPhone tiene que enviar la señal de dispositivo a su servidor de proveedor java. (Para propósitos de depuración, que sólo puede NSLog el dispositivo token y utilizarlo; nunca cambia a través de carreras).

    Yo recomendaría que se crea un servidor en el servidor de proveedor Java para recibir tokens de dispositivo. Establecer un ServerSocket para recibir conexiones desde el iPhone y su token dispositivo (y cualquier información adicional que necesita) e insertar las fichas en la base de datos.

He intentado esto y me siguen dando colgado al enviar la notificación, y nada es enviado.

El problema se deriva de la siguiente función:

         public void sendNotification(Device device, PayLoad payload) 

Parece que el BufferedReader tiene NULL

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

Así que cuando esta parte del código es golpeado apenas cuelga allí en bucle sin fin

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

Esta salida es [nulo]

Así luego a la derecha después de entonces los bucles se ejecutan:

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

El código entra en el primer bucle while y espera a que el BufferedReader en para estar listo y sólo sigue esperando ..... anuncio que es su colgante

JavaPNS se ha actualizado recientemente a 2,0, y se fijan todas las incidencias hasta la fecha de lanzamiento. Lo hace solucionar el problema que usted está describiendo, y el uso de la biblioteca es mucho más sencillo de lo que era (se puede empujar una notificación con una sola línea de código ahora).

Parece que falta el token

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

Toma de identificación y verificación del token:

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

La única manera de obtener un token es de la aplicación para el iPhone. Un token válido es como la siguiente: 1d2d6f34 c5028bca c50df5f9 1992c912 ce7deae8 3bbe7da5 447f6a68 cfecdc0e

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top