2013-06-04 7 views
5

Zaimplementowałem application:didReceiveRemoteNotification: do przechowywania danych w mojej aplikacji po otrzymaniu powiadomienia Push.
Jednak kiedy moja aplikacja jest w tle i otrzymywać powiadomienia, dane są zapisywane tylko jeśli dotknę sztandar powiadomienia pojawiające się na górze:Gdy moja aplikacja działa w tle, powiadomienia push są obsługiwane tylko po dotknięciu górnego baneru powiadomień i nie działają, gdy kliknę ikonę aplikacji

Zamiast tego, jeśli ja dotknąć ikonę aplikacji, aby ją otworzyć ponownie, zawartość powiadomienie nie jest przechowywane:

application:didReceiveRemoteNotification: jest wywoływany tylko po naciśnięciu banera powiadomień na górze.

Użyłem applicationWillEnterForeground i didFinishLaunchingWithOptions metod i jednocześnie klikając ikonę aplikacji i debugowania jej wejścia applicationWillEnterForeground i kontrola idzie donikąd. Oto kod dla didFinishLaunchingWithOptions i applicationWillEnterForeground i didReceiveRemoteNotification.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    self.isForeground = YES; 

    // Let the device know we want to receive push notifications 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 
    storage= [[NSMutableArray alloc]init]; 
    if (launchOptions != nil) { 
     // launched from notification item click 
     NSDictionary *userInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; 
     if (userInfo != nil) [self HandleNotification:userInfo]; 
    } 
    return YES; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application { 
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 
    isForeground = YES; 
    NSArray *subviews = [window subviews]; 
    for (int i = 0; i < [subviews count]; i++) { 
     [[subviews objectAtIndex:i] removeFromSuperview]; 
    } 
    //[self.window addSubview:tabBarController.view]; 
    [self.window makeKeyAndVisible]; 
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; 
    self.window.rootViewController = self.viewController; 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    [self HandleNotification:userInfo]; 
} 

- (void)HandleNotification:(NSDictionary *)userInfo { 
    ApiWrapper *wrapper = [[ApiWrapper alloc] init]; 
    NSString *dteStr = [[NSString alloc] init]; 
    NSDate *nowdate = [NSDate date]; 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    //[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/London"]]; 
    [dateFormat setDateFormat:@"dd/MM/yyyy HH:mm:ss"]; 
    dteStr = [dateFormat stringFromDate:nowdate]; 
    [dateFormat release]; 

    NSString *notifId = [userInfo objectForKey:@"NotificationId"]; 
    NSData *test = self.strTest; 
    NSString *strToken = [NSString stringWithFormat:@"%@", test]; 
    strToken = [strToken substringWithRange:NSMakeRange(1, [strToken length] - 2)];  

    [wrapper deviceResponse:notifId:dteStr:strToken]; 

    NSLog(@".....user info%@", userInfo); 
    NSDictionary *pushInfo = [userInfo objectForKey:@"aps"]; 
    NSString *alertstring = [pushInfo objectForKey:@"alert"]; 
    NSLog(@"Alertstring: %@", alertstring); 

    [UIApplication sharedApplication].applicationIconBadgeNumber = [[[userInfo objectForKey:@"aps"] objectForKey: @"badgecount"] intValue]; 

    MLNotifMessage *objNotif = [[MLNotifMessage alloc] init]; 
    objNotif.notifText = alertstring;  
    NSDate *nowdate1 = [NSDate date]; 
    NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init]; 
    //[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/London"]]; 
    [dateFormat1 setDateFormat:@"dd/MM/yyyy HH:mm:ss"]; 
    objNotif.datenow = [dateFormat1 stringFromDate:nowdate1]; 
    [dateFormat1 release]; 

    NSLog(@"Date in delegate class is %@", objNotif.datenow); 
    [storage addObject:objNotif];  

    if (self.isForeground) { 
     NSArray *subviews = [window subviews]; 
     for (int i = 0; i < [subviews count]; i++) { 
      [[subviews objectAtIndex:i] removeFromSuperview]; 
     } 
     [self.window makeKeyAndVisible]; 
     self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; 
     self.window.rootViewController = self.viewController; 
    } 
} 
+0

Po dotknięciu ikony aplikacji, aplikacja po prostu się otwiera. Aplikacja zostanie poproszona tylko o obsługę powiadomienia, jeśli użytkownik go dotknie. – Greg

Odpowiedz

1

Nie można pobrać danych do powiadomienia push, jeśli kliknięto ikonę aplikacji na ekranie głównym. Ale jest na odwrót, możesz wysłać mały ładunek do serwera za każdym razem, gdy aplikacja wejdzie na pierwszy plan, a następnie poprosić serwer o natychmiastowe wysłanie powiadomienia push.

Also take a look at this : your question is possibly duplicate of it.

Nadzieja to pomaga.

+0

można powiedzieć, jak wysłać ładunek i sprawić, aby serwer wysyłał powiadomienia push. – arshad

+0

to jest coś, co musisz zrobić na własnym serwerze z własną logiką .. jeśli nie korzystasz z usługi takiej jak sterowiec miejski – Bastian

0

Ogólnie rzecz biorąc, aplikacja nie powinna wymagać wymagać powiadomienia push dla normalnej pracy. Apple nie gwarantuje nawet, że powiadomienia push zostaną dostarczone (spadnie całkowicie, jeśli nie będzie dostępne).

Twoja aplikacja powinna zawsze rozmawiać z serwerem, aby uzyskać autorytatywny stan danych użytkownika (lub cokolwiek, co przedstawiasz). Jeśli otrzymasz powiadomienie push, możesz oczywiście użyć go jako wskazówki do aktualizacji lub wyświetlenia nowych informacji. Ale nawet jeśli użytkownik normalnie klika ikonę aplikacji (dlatego nie ma powiadomienia), skontaktuj się z serwerem, aby pobrać lub zaktualizować wszystko, czego potrzebujesz.

-1

Mimo że jest to starsze pytanie, zajmuje wysoką pozycję w tym temacie i istnieje rozwiązanie dla niego od iOS7.

Istnieje metoda o nazwie application:didReceiveRemoteNotification:fetchCompletionHandler:, która zostanie wywołana, nawet jeśli aplikacja jest w tle.

Problem polegał na tym, że nie został wywołany. Następnie znalazłem this article i zdałem sobie sprawę, że muszę włączyć "Zdalne powiadomienia" w ramach możliwości mojego projektu, aby to zadziałało.

Mam nadzieję, że to pomoże.

Powiązane problemy