6

Questo è un seguito del mio precedente posting su StackOverflow.Problema nell'invio di Apple Push Notification utilizzando Java e REST

Calcolato è meglio iniziare un nuovo post (poiché ho fatto più progressi rispetto a prima) piuttosto che aggiungere una nuova domanda su un thread precedente.

Am usando la libreria Javapns su Google Code per inviare una notifica push di Apple attraverso un servizio basato sul web REST ...

qui sono i passi che ho completato:

iPhone Developer Program Portal (IDPP):

(1) Creato l'ID applicazione e le chiavi e certificati SSL basati su APNS.

(2) Creato e installato il profilo di fornitura.

(3) Installato il certificato SSL e la chiave sul server.

(4) Configurare l'app per iPhone per la registrazione delle notifiche remote.

XCode:

è stato in grado di ottenere il mio gettone dispositivo quando ho costruito e implementato la mia app sul mio dispositivo.

Non appena l'app per iPhone è stata distribuita, sul mio iPhone è apparso il messaggio di dialogo che indicava che la mia app desiderava inviare notifiche push e ha anche chiesto il permesso per consentirle.

Quando ho richiamato il mio servizio web, tramite le mie istruzioni Log4J, sono stato in grado di vedere che il mio servizio web basato su REST è stato effettivamente richiamato ma non ho mai ricevuto una notifica push sulla mia app per iPhone!

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

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

Ora, quando schiero la mia app al mio assistente di app e di aprire un client di riposo e digitare:

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

Il client resto restituisce questo:

HTTP/1.1 200 OK

messaggi vengono emessi alla mia console il seguente registro:

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

Tuttavia, non ricevo la notifica push sulla mia app (residente sul mio iPhone)!

Sono veramente sconcertato a questo punto ...

Cosa potrei fare male? :(

E 'un problema con il modo in cui ho impostato il mio servizio web RESTful (scusate Sono un novizio di riposo)?

realmente lo apprezzerei se qualcuno mi potrebbe aiutare con questo ...

Grazie per aver il tempo di leggere questo ...

+0

La stringa Token contiene uno spazio. È stato introdotto quando hai copiato il codice qui? Prova a rimuoverlo. – notnoop

+0

Ciao Saeed ... Sì, lo spazio della stringa token è stato introdotto quando ho copiato il codice (e ho riformattato il codice per renderlo più visivo qui). Nel mio codice attuale non c'è spazio. Sono ancora bloccato, quindi sarei grato se qualcuno potesse aiutarmi con questo. Ho pochi spy in esecuzione e quando eseguo il servizio web mi chiede se desidero connettermi alla porta 2195 e invia la notifica push. Semplicemente non appare sull'app del mio iPhone. C'è qualcosa che sto sbagliando? È il codice REST? –

+0

È inoltre necessario includere il codice per i metodi "Gestione di notifiche remote" di UIApplicationDelegate implementato. – bpapa

risposta

5

scoperto la soluzione! la stringa di token generato dispositivo sembrava troppo a lungo.

mio NSData al codice esadecimale stava stampando il token sbagliato (dovrebbe essere 64 personaggi, prima che fossero 155 caratteri).

Soluzione:

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

Ora, io sto ricevendo le notifiche sul dispositivo! :)

Buona programmazione a tutti!

Problemi correlati