0

Я использую Objective-C. Я хочу представить infoViewController с контентом извещения.Невозможно представить ViewController правильно при прослушивании уведомлений

Вот мой код:

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    [self presentViewControllerWithUserInfo:userInfo]; 
} 


- (void)presentViewControllerWithUserInfo:(NSDictionary *)userInfo { 
    infoViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"info"]; 
    vc.infoString = [[userInfo objectForKey:@"info"] objectForKey:@"string"]; 

    //NSLog(@"class: %@", [self.window.rootViewController class]); 

    [self.window.rootViewController presentViewController:vc animated:YES completion:nil]; 
} 

Я представляю infoViewController по rootViewController. Но что делать, если приложение входит в фон, когда оно не находится в rootViewController? Конструкция выглядит так: enter image description here

Приложение входит в фон, когда оно находится в «Другой странице», и я отправил Notification в свое приложение. Когда я пытаюсь открыть свое приложение из уведомления. Консоль сказала мне следующее: enter image description here

И не представилось infoViewController. Кто-то мне помог.

+0

Вы можете refere мой ответ здесь: http://stackoverflow.com/questions/36709454/how-to-open-particular-post-on-the-click-on-push-notification/36709695# 36709695, если приложение убито, то что происходит с событием push-уведомления, здесь объясняется. –

ответ

0

я думаю, что при выходе из приложения метод didReceiveRemoteNotification не вызывается при нажатии на уведомление, вместо этого метода didFinishLaunchingWithOptions вызывается там вы должны проверить приложение погоды запускается уведомления

Помещенный ниже код в ваших didFinishLaunchingWithOptions:

NSDictionary *launchOptionDict = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 
    if (launchOptionDict) { 
     [self presentViewControllerWithUserInfo:launchOptionDict]; 
    } 
1

Журнал ошибок сообщает вам, что вы пытаетесь представить InfoViewController с контроллера, который не находится на переднем плане, и это правильно, потому что другой контроллер был представлен.

Мое решение для этого:

  1. Создать BaseViewController класс (если у вас еще нет), которые должны быть расширены от всех контроллеров вашего приложения.
  2. Создать static Свойство UIViewController в BaseViewController называется CURRENT_CONTROLLER.
  3. CURRENT_CONTROLLER = self in viewDidAppear() метод.
  4. Не забудьте вызвать super.viewDidAppear(), если вы переопределите этот метод в любом контроллере вида.

Затем, когда вы получите удаленного оповещения сделать что-то вроде этого:

infoViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"info"]; 
vc.infoString = [[userInfo objectForKey:@"info"] objectForKey:@"string"]; 

if (BaseViewController.CURRENT_CONTROLLER != nil) { 
    [BaseViewController.CURRENT_CONTROLLER presentViewController:vc animated:YES completion:nil]; 
} else { 
    // app just started, your code works well 
    // this code could never be executed if you extend BaseViewController from all your view controllers 
} 
0

метод вызова с некоторой задержкой. попробуй это.

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
//code to be executed on the main queue after delay 
[self presentViewControllerWithUserInfo:userInfo]; 
}); 
Смежные вопросы