2013-06-04 2 views
5

Ich habe application:didReceiveRemoteNotification: implementiert, um Daten in meiner App zu speichern, wenn eine Push-Benachrichtigung empfangen wird.
jedoch, wenn meine app im Hintergrund und ich erhalten eine Benachrichtigung, werden die Daten nur dann gespeichert, wenn ich die Meldung Banner erscheint oben berühren:Wenn meine App im Hintergrund ist, werden Push-Benachrichtigungen nur verarbeitet, wenn ich das obere Benachrichtigungsbanner berühre und nicht funktioniert, während ich auf App-Symbol klicke

Stattdessen, wenn ich das App-Symbol berühren sie wieder zu öffnen, den Inhalt der Benachrichtigung wird nicht gespeichert:

application:didReceiveRemoteNotification: wird nur aufgerufen, wenn ich das Benachrichtigungsbanner oben drücken.

Ich habe applicationWillEnterForeground und didFinishLaunchingWithOptions Methoden verwendet und während Sie auf das App-Symbol klicken und debuggen die Eingabe applicationWillEnterForeground und Kontrolle geht nirgends. Hier ist der Code für didFinishLaunchingWithOptions und applicationWillEnterForeground und 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

Wenn Sie auf das App-Symbol tippen, wird die App geöffnet. Die App wird nur aufgefordert, die Benachrichtigung zu bearbeiten, wenn der Benutzer sie gezielt anspricht. – Greg

Antwort

1

Sie können keine Daten für die Push-Benachrichtigung erhalten, wenn Sie auf dem Startbildschirm auf das App-Symbol geklickt haben. Es kann jedoch passieren, dass Sie eine kleine Nutzlast an Ihren Server senden können, wenn die App in den Vordergrund tritt, und bitten Sie den Server, sofort eine Push-Benachrichtigung zu senden.

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

Hoffnung, dies hilft Ihnen.

+0

können Sie bitte sagen, wie Payload zu senden und Server Push-Benachrichtigung senden. – arshad

+0

das ist etwas, was Sie auf Ihrem eigenen Server mit Ihrer eigenen Logik tun müssen ... wenn Sie keinen Dienst wie städtisches Luftschiff verwenden – Bastian

0

Im Allgemeinen sollte Ihre App nicht erfordern den Inhalt der Push-Benachrichtigungen für den normalen Betrieb. Apple garantiert nicht einmal, dass Push-Benachrichtigungen geliefert werden (es werden alle bis auf die neuesten fallen gelassen, wenn das Gerät nicht verfügbar ist).

Ihre App sollte immer mit dem Server sprechen, um den autoritativen Status der Benutzerdaten (oder was auch immer Sie präsentieren) zu erhalten. Wenn Sie eine Push-Benachrichtigung erhalten, können Sie diese natürlich als Hinweis verwenden, um neue Informationen zu aktualisieren oder anzuzeigen. Aber selbst wenn der Benutzer das App-Icon normal antippt (also keine Benachrichtigung), sollten Sie sich an den Server wenden, um alles, was Sie benötigen, zu holen oder zu aktualisieren.

-1

Auch wenn dies eine ältere Frage ist, steht sie in diesem Thema ganz oben und es gibt eine Lösung dafür ab iOS7.

Es gibt eine Methode namens application:didReceiveRemoteNotification:fetchCompletionHandler:, die auch dann aufgerufen wird, wenn sich Ihre Anwendung im Hintergrund befindet.

Das Problem, das ich hatte, ist, dass es nicht angerufen wurde. Ich fand dann this article und erkannte, dass ich "Remote Notifications" in den Fähigkeiten meines Projekts aktivieren musste, damit dies funktionierte.

Hoffe, das hilft.