Tôi đã triển khai application:didReceiveRemoteNotification:
để lưu trữ dữ liệu trong ứng dụng của mình khi nhận được thông báo đẩy.
Tuy nhiên, khi ứng dụng của tôi ở chế độ nền và tôi nhận được thông báo, dữ liệu chỉ được lưu trữ nếu tôi chạm vào biểu ngữ thông báo xuất hiện ở trên cùng:Khi ứng dụng của tôi ở chế độ nền, thông báo đẩy chỉ được xử lý nếu tôi chạm vào biểu ngữ thông báo trên cùng và không hoạt động khi tôi nhấp vào biểu tượng ứng dụng
Thay vào đó, nếu tôi chạm vào biểu tượng ứng dụng để mở lại, nội dung của thông báo không được lưu trữ:
application:didReceiveRemoteNotification:
chỉ được gọi khi tôi đẩy biểu ngữ thông báo lên trên cùng.
Tôi đã sử dụng các phương pháp applicationWillEnterForeground
và didFinishLaunchingWithOptions
và trong khi nhấp vào biểu tượng ứng dụng và gỡ lỗi nhập applicationWillEnterForeground
và điều khiển của bạn không thành công. Đây là mã cho didFinishLaunchingWithOptions
và applicationWillEnterForeground
và 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;
}
}
Khi bạn nhấn vào biểu tượng ứng dụng, ứng dụng sẽ mở ra. Ứng dụng chỉ được yêu cầu xử lý thông báo nếu người dùng nhấn cụ thể vào ứng dụng đó. – Greg