繁体   English   中英

当我的应用程序处于后台时,仅当我触摸顶部通知横幅并且在我单击应用程序图标时不工作时才会处理推送通知

[英]When my app is in background, push notifications are handled only if I touch the top notification banner and not working while I click app icon

我已经实现了application:didReceiveRemoteNotification:在收到推送通知时将数据存储在我的应用程序中。
但是,当我的应用程序处于后台并且收到通知时,仅当我触摸顶部显示的通知横幅时才会存储数据:

相反,如果我触摸应用程序图标以重新打开它,则不会存储通知的内容:

application:didReceiveRemoteNotification:仅当我将通知横幅推到顶部时才会调用。

我已经使用了applicationWillEnterForegrounddidFinishLaunchingWithOptions方法,同时单击应用程序图标并调试其输入的applicationWillEnterForeground和控件无处可去。 这是didFinishLaunchingWithOptionsapplicationWillEnterForeground以及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;
    }
}

如果点击主屏幕上的应用程序图标,则无法获取推送通知的数据。 但是有办法解决,只要应用程序进入前台,您就可以向服务器发送一个小的负载,然后请求服务器立即发送推送通知。

另外看看这个:你的问题可能是重复的。

希望这对你有所帮助。

通常,您的应用程序不应要求正常操作的推送通知内容。 Apple甚至不保证会发送推送通知(如果设备不可用,它将会丢弃最新的通知)。

您的应用应始终与服务器通信,以获取用户数据的权威状态(或您呈现的任何内容)。 如果您确实收到推送通知,您当然可以将其用作更新或显示新信息的提示。 但即使用户正常点击您的应用图标(因此没有通知),您也应该联系服务器以获取或更新您需要的所有内容。

即使这是一个较老的问题,它在这个主题中排名很高,并且从iOS7开始就有一个解决方案。

有一个名为application的方法:didReceiveRemoteNotification:fetchCompletionHandler:即使你的应用程序在后台也会被调用。

我遇到的问题是它没有被调用。 然后我发现了这篇文章并意识到我必须在我的项目功能中启用“远程通知”才能使其正常工作。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM