我已经实施application:didReceiveRemoteNotification:
,以便在收到推送通知时在我的应用中存储数据
但是,当我的应用程序处于后台并收到通知时,仅当我触摸顶部显示的通知横幅时才会存储数据:
相反,如果我触摸应用程序图标重新打开它,则不会存储通知内容:
仅当我将通知横幅推到最顶层时才会调用 application:didReceiveRemoteNotification:
。
我使用了applicationWillEnterForeground
和didFinishLaunchingWithOptions
方法,在点击应用图标并调试其输入applicationWillEnterForeground
时,控件无处可去。以下是didFinishLaunchingWithOptions
和applicationWillEnterForeground
以及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 :(得分:1)
如果点击主屏幕上的应用图标,则无法获取推送通知的数据。 但有办法解决,只要应用程序进入前台,您就可以向服务器发送一个小的负载,然后请求服务器立即发送推送通知。
Also take a look at this : your question is possibly duplicate of it.
希望这会对你有所帮助。
答案 1 :(得分:0)
通常,您的应用不应要求正常操作的推送通知内容。 Apple甚至不保证会发送推送通知(如果设备不可用,它将会丢弃最新的通知)。
您的应用应始终与服务器通信,以获取用户数据的权威状态(或您呈现的任何内容)。如果您确实收到推送通知,您当然可以将其用作更新或显示新信息的提示。但即使用户正常点击您的应用图标(因此没有通知),您也应该联系服务器以获取或更新您需要的所有内容。
答案 2 :(得分:-1)
尽管这是一个较老的问题,但它在本主题中排名很高,并且从iOS7开始就有解决方案。
有一种名为application:didReceiveRemoteNotification:fetchCompletionHandler:的方法即使您的应用程序在后台也会被调用。
我遇到的问题是它没有被调用。然后我发现this article并意识到我必须在项目的功能中启用“远程通知”才能使其正常工作。
希望这有帮助。