Подтвердить что ты не робот

Запуск определенного viewController в ответ на удаленное push-уведомление

Я создаю приложение, для которого раскадровка похожа на изображение ниже:

storyboard

Когда пользователь входит в систему с "Sysalert View Controller", они приводятся в "Контроллер представления списка сообщений", где я подключаю NSURLConnection для загрузки некоторого JSON в таблицу. Когда пользователь удаляет строку в таблице, они приводятся в "Сведения о сообщении", которая показывает более подробную информацию для этого сообщения.

Когда пользователь запускает приложение из push-уведомления, независимо от состояния приложения перед запуском, я хочу, чтобы приложение загрузило данные "Список сообщений" с моего сервера, а затем покажет им сообщение, которое только что было нажато к устройству.

Я знаю, что мне нужно использовать didFinishLaunchingWithOptions, чтобы приложение могло реагировать на push-уведомление, но как настроить иерархию представлений, чтобы диспетчер представлений "Список сообщений" загружал свои данные, а затем нажимает "Сведения о сообщении", просмотреть контроллер в стек для соответствующего сообщения?

По сути, этот тип имитирует поведение приложений "Сообщения" или "Почта". Если открытие с уведомлением приводит вас к контроллеру представления для этого сообщения, но вы все еще можете вернуться в иерархию, как если бы вы запустили приложение из начального диспетчера viewController и по очереди проходили через viewControllers.

4b9b3361

Ответ 1

Возможно делать то, что вы описываете, но я бы не рекомендовал его.

Frist, поместите отключенный контроллер представления с представлением, которое вы хотите в раскадровке, дадите контроллеру вида идентификатор, что-то вроде "My Push Notification View"

В didFinishLaunchingWithOptions: вы можете перейти к корневому контроллеру из делегата приложения. Этот контроллер будет навигационным контроллером. Используя навигационный контроллер, вы можете нажать новый контроллер представления поверх стека. Чтобы создать новый контроллер представления, вы создаете экземпляр контроллера представления с помощью идентификатора "My Push Notification View".

UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
UIViewController *notificationController = [navController.storyboard instantiateViewControllerWithIdentifier:@"My Push Notification View"];

[navController pushViewController:notificationController animated:YES];

Я думаю, вы захотите использовать что-то вроде -presentViewController:animated:completion:, чтобы показать модальное представление вместо прерывания стека навигации.

UIViewController *rootController = (UIViewController *)self.window.rootViewController;
UIViewController *notificationController = [rootController.storyboard instantiateViewControllerWithIdentifier:@"My Push Notification View"];

[rootController presentViewController:notificationController animated:YES completion:NULL];

Ответ 2

Попробуйте Это я использовал в одном из своих приложений, Пользователь - переменная в делетете приложения в качестве глобального

 ex: BOOL gotNotifcation;

-(void)application:(UIApplication*)app didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NotificationsViewController *notificationobject = [[NotificationsViewController alloc]init];
    [self.navigationController pushViewController:notificationobject animated:YES];
    gotNotifcation = YES;   
}

В NotificationsViewController для действия кнопки "Назад", если она настроена на кнопку

-(void)gotoback
{
    AppDelegate *delegate =(AppDelegate *)[UIApplication sharedApplication].delegate;

    if(delegate.gotNotifcation)
    {
        delegate.gotNotifcation = NO;
        MessageListController *feed = [[MessageListController alloc] init];
        [self.navigationController pushViewController:feed animated:NO];
    }
    else
    {
        [self.navigationController popViewControllerAnimated:NO];
    }
}