NSNotificationCenter и didReceiveRemoteNotification

У меня есть некоторые проблемы с NSNotificationCenter и didReceiveRemoteNotification. Я хочу открыть свой ViewController, когда получу новое уведомление от APNS. Внутри уведомления тела у меня есть objectId - это ключ. Я пытаюсь открыть свой ViewController в didReceiveRemoteNotification, но он не работает ((

AppDelegate.m

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{   
    [[NSNotificationCenter defaultCenter]
 postNotificationName:kDidReceiveRemoteNotification
 object:userInfo];
}

НовостиDetailViewController.m

- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(didReceiveRemoteNotification:)
 name:kDidReceiveRemoteNotification
 object:nil];
}

- (void)didReceiveRemoteNotification:(NSNotification *)notification
{
NSLog(@"%s %@",__func__,[notification.userInfo description]);
 }

Пост.ч

#define kDidReceiveRemoteNotification @"UIApplicationDidReceiveRemoteNotification"

ViewController не загружен. я не знаю, что делать.


person user2759544    schedule 27.08.2015    source источник
comment
NSNotificationCenter не имеет ничего общего с удаленными уведомлениями. Я предлагаю вам прочитать об этом и о push-уведомлениях, поскольку вы, кажется, смешиваете их? Если вы хотите открыть свой контроллер представления, вы можете просто сделать это непосредственно в didRecevieRemoteNotification. Я не знаю, почему вы упоминаете ключ objectId, вы нигде его не используете и не говорите, как вы собираетесь его использовать или для чего он нужен.   -  person Gruntcakes    schedule 28.08.2015
comment
@MartinH, я пытаюсь открыть контроллер просмотра без NSNotificationCenter. Мой контроллер представления открыт, но не загружен - пустое место, но должен быть загружен WebView или не загружена панель навигации ((( я не знаю, что нужно делать ((   -  person user2759544    schedule 28.08.2015
comment
Кажется, вы ожидаете, что NSNotificationCenter откроет для вас контроллер представления, я понятия не имею, откуда вы могли взять эту идею. Я пытаюсь открыть контроллер просмотра без NSNotificationCenter. Я думаю, вам следует начать новый вопрос, показывающий, как вы пытались открыть контроллер представления, и начать оттуда.   -  person Gruntcakes    schedule 28.08.2015
comment
@MartinH, я просто думаю, что люди покажут пример кода)   -  person user2759544    schedule 28.08.2015


Ответы (1)


Текущий поток примера кода, который вы приложили:

  1. При получении push-уведомления опубликуйте уведомление в NSNotificationCenter (что-то совершенно другое и не связанное с push-уведомлениями).
  2. Когда загружается другое представление (кому-то нужно было загрузить это представление до получения push-уведомления), подпишитесь на это уведомление NSNotificationCenter.
  3. Когда уведомление опубликовано, распечатайте его в журнале.

Мне было трудно понять это из вашего вопроса, но если контроллер представления, который вы пытаетесь запустить в результате получения push-уведомления, является NewsDetailViewController, то ваш код этого не делает. Что делает ваш код, так это распечатывает уведомление для регистрации (при условии, что кто-то еще убедился, что NewsDetailViewController загружен до получения push-уведомления).

Чтобы загрузить NewsDetailViewController при получении push-уведомления, вам не нужно публиковать уведомление в NSNotification.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{   
    NewsDetailViewController *newsVC = [[NewsDetailViewController alloc] initWithNibName:@"NewsDetailViewController" bundle:nil];
    [self.window.rootViewController.view addSubview:newsVC.view];
}

Или любую другую логику загрузки, которая вам больше подходит. Но в текущем коде, который вы разместили, нет никакой связи между получением push-уведомления и загрузкой ViewController.

Надеюсь, это поможет. Удачи!

person Rony Rozen    schedule 28.08.2015
comment
спасибо за подсказку, но переменную self.view - AppDelegate не видит, может self.window.rootViewController? - person user2759544; 28.08.2015
comment
Да, ты прав. Я писал это так, как будто это было в UIViewController, а не в AppDelegate. Я отредактировал пост с исправлением. - person Rony Rozen; 28.08.2015
comment
@Chouch хм, мое приложение вылетает. Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Не удалось загрузить NIB в пакете: «NSBundle, возможно, приложение не видит контроллер представления. - person user2759544; 28.08.2015
comment
Вам нужен файл .xib с соответствующим именем, измените имя во фрагменте кода на имя в вашем проекте или просто загрузите представление без пера. Измените метод загрузки на любой, который вы считаете нужным, но основная идея заключается в том, что вам не нужно использовать NSNotificationCenter. - person Rony Rozen; 28.08.2015
comment
@Choch, спасибо, это хорошая идея. Последний вопрос - когда я загружаю свое представление из appdelegate, моя панель навигации (с кнопками и т. д.) не отображается, тело с текстом в WebView и панель инструментов отображается и работает, но панель навигации не отображается, что это? - person user2759544; 28.08.2015
comment
При работе с панелью навигации вы должны работать с навигационным контроллером для нажатия/выталкивания контроллеров представления, а не добавлять их напрямую, как я написал в своем первоначальном ответе. Как только вы это сделаете, это, вероятно, решит вашу проблему. - person Rony Rozen; 28.08.2015
comment
Но затем я сделал панель навигации загруженной, но тело и панель инструментов не загружаются ((просто пустое место. Я не знаю, что делать, может быть, написать функцию для загрузки веб-просмотра и панели инструментов и использовать, когда я создаю контроллер представления объекта. - person user2759544; 28.08.2015
comment
Вы должны опубликовать свой код в виде отдельного вопроса, чтобы вам было легче помочь - person Rony Rozen; 28.08.2015