Problema en el controller de vista abierta cuando se recibe APNS en iOS

Hola, soy nuevo en el iPhone y he estado intentando utilizar una notificación push de Apple. Básicamente, lo que quiero hacer es que cuando el usuario click el post de notificación de recibo recibido, entonces necesito abrir un controller de vista específico, está funcionando para mí. He agregado datos personalizados con el parámetro key "tipo" a mi carga útil JSON.

aquí está mi carga JSON:

{"aps":{"alert":"This is testing message","type":"Notify","badge":1,"sound":"default"}} 

aquí está mi código:

 @synthesize viewControllerNotify; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication shanetworkingApplication] setApplicationIconBadgeNumber:0]; [[UIApplication shanetworkingApplication] cancelAllLocalNotifications]; [[UIApplication shanetworkingApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; screenBounds = [[UIScreen mainScreen] bounds]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; if (launchOptions != nil) { //Launched from push notification NSDictionary *userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]; NSDictionary *apsInfo = [userInfo objectForKey:@"aps"]; NSMutableString *notificationType = [apsInfo objectForKey:@"type"]; //For networkingirect to the view if([notificationType isEqualToString:@"Notify"]){ //Notify updates UpdatesViewController *uvc1 = [[UpdatesViewController alloc] initWithNibName:@"UpdatesViewController" bundle:nil]; self.viewControllerNotify = uvc1; } else if([notificationType isEqualToString:@"Voting"] || [notificationType isEqualToString:@"QA"]){ //Voting & QA VotingQAViewController *votingQAViewController = [[VotingQAViewController alloc] initWithNibName:@"VotingQAViewController" bundle:nil]; self.viewControllerNotify = votingQAViewController; } else if([notificationType isEqualToString:@"Survey"] || [notificationType isEqualToString:@"Quiz"]){ //Survey & Quizzes SurveysViewController *surveysViewController = [[SurveysViewController alloc] initWithNibName:@"SurveysViewController" bundle:nil]; self.viewControllerNotify = surveysViewController; } UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:self.viewControllerNotify]; self.window.rootViewController = nav; [nav setNavigationBarHidden:YES]; } else{ //Normal Launch if(screenBounds.size.height == 568) {//iPhone5 splashViewController = [[SplashViewController alloc] initWithNibName:@"SplashViewController_5" bundle:nil]; } else{ splashViewController = [[SplashViewController alloc] initWithNibName:@"SplashViewController" bundle:nil]; } UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:splashViewController]; self.window.rootViewController = nav; [nav setNavigationBarHidden:YES]; } [self.window makeKeyAndVisible]; return YES; } - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo { NSDictionary *aps = (NSDictionary *)[userInfo objectForKey:@"aps"]; int badge = [[aps objectForKey:@"badge"] intValue]; NSMutableString *notificationType = [aps objectForKey:@"type"]; NSLog(@"Number of badge is = %d", badge); NSLog(@"notification type is = %@", notificationType); //For networkingirect to the view if([notificationType isEqualToString:@"Notify"]){ //Notify updates UpdatesViewController *uvc1 = [[UpdatesViewController alloc] initWithNibName:@"UpdatesViewController" bundle:nil]; self.viewControllerNotify = uvc1; } else if([notificationType isEqualToString:@"Voting"] || [notificationType isEqualToString:@"QA"]){ //Voting & QA VotingQAViewController *votingQAViewController = [[VotingQAViewController alloc] initWithNibName:@"VotingQAViewController" bundle:nil]; self.viewControllerNotify = votingQAViewController; } else if([notificationType isEqualToString:@"Survey"] || [notificationType isEqualToString:@"Quiz"]){ //Survey & Quizzes SurveysViewController *surveysViewController = [[SurveysViewController alloc] initWithNibName:@"SurveysViewController" bundle:nil]; self.viewControllerNotify = surveysViewController; } [[UIApplication shanetworkingApplication] setApplicationIconBadgeNumber:0]; [[UIApplication shanetworkingApplication] cancelAllLocalNotifications]; UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:self.viewControllerNotify]; self.window.rootViewController = nav; [nav setNavigationBarHidden:YES]; [self.window makeKeyAndVisible]; } 

Mi pregunta es: ¿esta es la forma correcta de networkingirigir al controller de vista cuando se recibe la notificación de inserción?

Usando el código anterior, se está networkingirigiendo a la class de controller de vista en nombre en el tipo de notificación (key personalizada de notificación payload json) con éxito en el modo de background y de background, pero el button de volver a dirigir el controller de vista no funciona. No sé dónde estoy haciendo mal aquí. Si alguien sabe, entonces ayúdeme. Gracias.

Mejor puede publicar la notificación utilizando NSNotificationCentre en didReceiveRemoteNotification y recibir la notificación en las otras classs. Para que pueda insert el controller de vista requerido desde el controller de vista actual (no es necesario establecerlo como controller de vista raíz). Entonces, el button volverá a funcionar.

Para el ex.

 [[NSNotificationCenter defaultCenter] postNotificationName:kMesssagePushNotification object:nil userInfo:userInfo]; 

El button Atrás no funciona porque está configurando la vista de destino como una vista de raíz. En su lugar, debería build la stack de navigation completa, es decir, generalmente, si tiene un controller de vista de navigation como un controller de vista raíz, primero debe crearlo y luego build todos los controlleres de vista que estén entre la raíz y la vista de hoja.

Por ejemplo, si MainViewController sería su vista de inicio normal y el button Atrás de UpdatesViewController debería conducir a MainViewController, haría:

 MainViewController *mainVC = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; UpdatesViewController *updatesVC = [[UpdatesViewController alloc] initWithNibName:@"UpdatesViewController" bundle:nil]; UINavigationController *navVC=[[UINavigationController alloc]initWithRootViewController:mainVC]; [navVC setViewControllers:@[mainVC, updatesVC] animated:NO]; self.window.rootViewController = navVC; 

Hay dos posibilidades de que acceda a los datos de notificación.

  1. Si recibe la notificación cuando su aplicación no está activada, click la notificación y obtendrá los datos de notificación en la siguiente function:
 - (BOOL) aplicación: aplicación (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions 

utilizar

 launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] 

para acceder a los datos de notificación y abrir el controller de vista que esperaba.

  1. Si recibe la notificación cuando la aplicación está activada, pero su aplicación puede estar en segundo plano o en primer plano. Si es el primer caso, recibirá la notificación en el centro de notifications, su aplicación invocará la siguiente function después de hacer clic en la notificación:
 - (void) application: (UIApplication *) application didReceiveRemoteNotification: (NSDictionary *) userInfo

Si es el caso posterior, la aplicación invocará directamente la function antes. Y puedes distinguirlos usando el código que fluye:

 UIApplicationState state = [[UIApplication shanetworkingApplication] applicationState]; if (state == UIApplicationStateBackground || state == UIApplicationStateInactive){ //notification is received when your app is in background //open the view controller you expected }else if(state == UIApplicationStateActive){ //notification is received when your app is in foreground //do nothing } 

lo siento por mi grupo de inglés, espero que sea de ayuda ~