6

Jest to kontynuacja mojej poprzedniej wersji posting dotyczącej StackOverflow.Wystąpił problem podczas wysyłania powiadomienia Apple Push Notification za pomocą Java i REST

Pomyślałem, że lepiej jest rozpocząć nowy post (ponieważ zrobiłem większy postęp niż poprzednio) niż dołączać nowe pytanie do poprzedniego wątku.

używam biblioteki Javapns Google Code wysłać powiadomienie push firmy Apple poprzez REST oparte usługi internetowej ...

Oto kroki, które mam ukończone:

iPhone Developer Program (portal IDPP):

(1) Utworzono identyfikator aplikacji i certyfikat SSL oraz klucze oparte na APNS.

(2) Utworzono i zainstalowano profil informacyjny.

(3) Zainstalował certyfikat SSL i klucz na serwerze.

(4) Skonfiguruj moją aplikację na iPhone'a, aby zarejestrować się na zdalne powiadomienia.

XCode:

była w stanie uzyskać mój znak urządzenia, kiedy zbudowany i wdrożony moją aplikację na urządzeniu.

Po wdrożeniu aplikacji na iPhone'a na moim iPhonie pojawił się komunikat informujący, że moja aplikacja chce wysyłać powiadomienia push, a także poprosić o pozwolenie na ich udostępnienie.

Po uruchomieniu usługi internetowej, za pomocą moich instrukcji Log4J, mogłem zauważyć, że moja usługa internetowa oparta na REST została rzeczywiście wywołana, ale nigdy nie otrzymałem powiadomienia push na mojej aplikacji na iPhone'a!

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

relaksującego 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(); 
    } 
} 

Teraz, kiedy wdrożyć mojej aplikacji do mojego serwera app i otwarcie klienta odpoczynku i wpisz:

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

Klient odpoczynku zwraca to:

HTTP/1.1 200 OK

Poniższa log komunikaty są wyprowadzane na konsolę:

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

Jednak nie otrzymuję powiadomień push w mojej aplikacji (rezydujących na moim iPhonie)!

jestem bardzo zakłopotany w tym momencie ...

Co mógłbym robić źle? :(

Czy to problem ze sposobu skonfigurować moje relaksującego usługę internetową (przepraszam jestem nowicjuszem na odpoczynek)?

naprawdę wdzięczny, jeśli ktoś może mi pomóc z tym ...

Dziękujemy za poświęcenie czasu na przeczytanie tego ...

+0

Łańcuch Token zawiera spację. Czy zostało to wprowadzone, kiedy skopiowałeś kod? Spróbuj go usunąć. – notnoop

+0

Cześć Saeed ... Tak, przestrzeń łańcucha znaków została wprowadzona po skopiowaniu kodu (i sformatowaniu kodu, aby był bardziej widoczny). W moim rzeczywistym kodzie nie ma miejsca. Nadal jestem zablokowany, więc byłbym wdzięczny, gdyby ktoś mógł mi w tym pomóc. Mam małą żabkę, a kiedy uruchomię usługę, pyta mnie, czy chcę połączyć się z portem 2195 i wysyła powiadomienie push. Po prostu nie pojawia się w aplikacji mojego iPhone'a. Czy jest coś, co robię źle? Czy to jest kod REST? –

+0

Powinieneś również uwzględnić kod dla metod "Obsługa powiadomień zdalnych" w UIApplicationDelegate, które zaimplementowałeś. – bpapa

Odpowiedz

5

odkrył rozwiązanie! wygenerowany urządzenie żeton ciąg wydawało się zbyt długo.

My NSData do drukowania kodu hex został niewłaściwy żeton (powinno być 64 postacie, zanim miało 155 znaków).

Rozwiązanie:

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

Teraz otrzymuję powiadomień na urządzeniu! :)

Wesołe programowanie dla wszystkich!

Powiązane problemy