6

Este es un seguimiento de mi anterior posting en StackOverflow.Problema al enviar Apple Push Notification usando Java y REST

Me figuró que es mejor comenzar una nueva publicación (ya que hice más progresos que antes) en lugar de agregar una nueva pregunta en una secuencia anterior.

Am usando la biblioteca Javapns en Google Code para enviar una notificación push de Apple a través de un servicio web basado en REST ...

Estos son los pasos que he completado:

iPhone Developer Program (Portal IDPP):

(1) Creé la aplicación ID y APNS basado certificado SSL y claves.

(2) Creó e instaló el perfil de aprovisionamiento.

(3) Instaló el certificado SSL y la clave en el servidor.

(4) Configurar mi aplicación de iPhone para registrarse para notificaciones remotas.

XCode:

pudo obtener mi token de dispositivo cuando he construido y desplegado mi aplicación en mi dispositivo.

Tan pronto como mi aplicación para iPhone se implementó, apareció el cuadro de diálogo en mi iPhone que indicaba que mi aplicación deseaba enviar notificaciones automáticas y también solicitó permiso para permitirlas.

Cuando invoqué mi servicio web, a través de mis declaraciones de Log4J, pude ver que mi servicio web basado en REST realmente se invocaba pero nunca recibí una notificación de inserción en mi aplicación de iPhone.

clase ApnsManager:

public class ApnsManager { 

    /** APNs Server Host **/ 
    private static final String HOST = "gateway.sandbox.push.apple.com"; 

    /** APNs Port */ 
    private static final int PORT = 2195; 

    public void sendNotification(String deviceToken) 
    throws Exception { 
     try { 
      PayLoad payLoad = new PayLoad(); 
      payLoad.addAlert("My alert message"); 
      payLoad.addBadge(45); 
      payLoad.addSound("default"); 

      PushNotificationManager pushManager = 
       PushNotificationManager.getInstance(); 

      pushManager.addDevice("iPhone", deviceToken); 

      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("iPhone"); 

      // Send Push 
      log.warn("Sending push notification..."); 
      pushManager.sendNotification(client, payLoad); 
      pushManager.stopConnection(); 
     } 
     catch (Exception e) { 
      e.printStackTrace("Unable to send push "); 
     } 
    } 
} 

REST Web Service:

@Path(ApnService.URL) 
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
public class ApnService { 
    public static final String URL = "/apns"; 

    @GET 
    @Path("send") 
    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    public String send() throws JSONException, IOException { 
     String msg = ""; 

     try { 
      log.debug("Inside ApnService.send() method."); 
      log.debug("Sending notification to device"); 
      ApnManager.sendNotification("32b3bf28520b977ab8eec50b482 
      25e14d07cd78 adb69949379609e40401d2d1de00000000738518e5c 
      000000003850978c38509778000000000000000000398fe12800398f 
      e2e0398fe1040000"); 
     } catch(Exception e) { 
       e.printStackTrace(); 
       msg = "fail"; 
     } 
     msg = "success"; 

     StringWriter sw = new StringWriter(); 
     JsonFactory f = new JsonFactory(); 
     JsonGenerator g = f.createJsonGenerator(sw); 

     g.writeStartObject(); 
     g.writeStringField("status", msg); 
     g.writeEndObject(); 
     g.close(); 

     return sw.toString(); 
    } 
} 

Ahora, cuando despliego mi aplicación a mi servidor de aplicaciones y abrir un cliente de descanso y escribe:

http: // localhost: 8080/myapp/apns/send

El cliente devuelve este resto:

HTTP/1.1 200 OK

el siguiente registro de mensajes se emiten a mi consola:

01:47:51,985 WARN [ApnsManager] Initializing connectiong with APNS... 
01:47:52,318 WARN [ApnsManager] Sending push notification... 

MyAppDelegate.m

- (void) applicationDidFinishLaunching : 
    (UIApplication*) application 
{ 
    NSLog(@"LAUNCH"); 

    // Configure REST engine 
    RESTAPI* api = [RESTAPI getInstance]; 
    [api setNetworkAddress:kLocalAddress port:kDefaultPort]; 

    UIRemoteNotificationType notificationTypes 
    = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound; 
    if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] 
     != notificationTypes) { 
     NSLog(@"Registering for remote notifications..."); 
     [[UIApplication sharedApplication] 
     registerForRemoteNotificationTypes:notificationTypes]; 
    } else { 
     NSLog(@"Already registered for remote notifications..."); 
     // Uncomment this if you want to unregister 
     // NSLog(@"Unregistering for remote notifications..."); 
     // [[UIApplication sharedApplication] unregisterForRemoteNotifications]; 
    } 

mainWindow = [[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds] retain]; 
toolsNav = [[[ToolsNav alloc] init] retain]; 

[mainWindow addSubview:toolsNav.view]; 
[mainWindow makeKeyAndVisible]; 
} 

Sin embargo, ¡no recibo la notificación de inserción en mi aplicación (que reside en mi iPhone)!

estoy realmente perplejo en este punto ...

¿Qué podría estar haciendo mal? :(

¿Es un problema con la forma puedo configurar mi servicio web REST (lo siento, soy muy novato para descansar)?

realmente lo apreciaría si alguien me podría ayudar con esto ...

Gracias por tomarse el tiempo para leer esto ...

+0

La cadena Token contiene un espacio. ¿Se introdujo cuando copió el código aquí? Intenta eliminarlo – notnoop

+0

Hola Saeed ... Sí, el espacio de la secuencia de tokens fue introducido cuando copié el código (y formateé el código para hacerlo más visual aquí). En mi código actual no hay espacio. Todavía estoy atascado, por lo que agradecería si alguien pudiera ayudarme con esto. Tengo poca snitch en ejecución y cuando ejecuto el servicio web me pregunta si deseo conectarme al puerto 2195 y envía la notificación de inserción. Simplemente no aparece en la aplicación de mi iPhone. ¿Hay algo que estoy haciendo mal? ¿Es el código REST? –

+0

También debe incluir el código para los métodos de "Gestión de notificaciones remotas" de UIApplicationDelegate que ha implementado. – bpapa

Respuesta

5

descubierto la solución! la cadena de señal generada dispositivo parecía demasiado largo.

Mi NSData a código hexadecimal estaba imprimiendo el token incorrecto (que debería ser 64 personajes, antes eran 155 caracteres)

Solución:

- (NSString *)hexadecimalDescription 
{ 
    NSMutableString *string = [NSMutableString stringWithCapacity:[self length] * 2]; 
    const uint8_t *bytes = [self bytes]; 

    for (int i = 0; i < [self length]; i++) 
     [string appendFormat:@"%02x", (uint32_t)bytes[i]]; 

    return [[string copy] autorelease]; 
} 

Ahora, estoy recibiendo las notificaciones en mi dispositivo! :)

Programación feliz a todos!

Cuestiones relacionadas