2015-05-30 7 views
0

Я хочу представить конкретный вид контроллера, когда пользователь нажимает на контроллер вида. Я знаю, что есть много вопросов для того же самого, что было опубликовано раньше, и было много ответов, но ничто из этого не работает для меня. Вот код в методе «didReceiveRemoteNotification» в моем «AppDelegate»Запуск конкретного контроллера просмотра при прослушивании уведомления

if(application.applicationState == UIApplicationStateInactive) { 

    NSLog(@"Inactive"); 

    //Show the view with the content of the push 
    if(userInfo) 
    { 
     NSLog(@"In inactive payload"); 
     // Create a pointer to the C object 
     NSString *cId = [userInfo objectForKey:@"c"]; 
     NSLog(cId); 
     PFObject *targetC = [PFObject objectWithoutDataWithClassName:@"C" objectId:cId]; 

     // Fetch C object 
     [targetC fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) { 
      C *c = [[C alloc] initWithPFObject:object]; 

      // Show c view controller 
      if (!error) { 
       NSLog(c.title); 

       CDetailsViewController *viewController = [[CDetailsViewController alloc] initWithC:c]; 
       //[self.navigationController pushViewController:viewController animated:YES]; 
       [self.navigationController presentViewController:viewController animated:YES completion:nil]; 
      } 
     }]; 

    } 

    handler(UIBackgroundFetchResultNewData); 

я получаю точные данные я послал в моем толчке, как я могу видеть из журнала гравюр, которые я получаю. Только проблема заключается в том, что контроллер представления, который я пытаюсь представить/push, никогда не отображается при прослушивании уведомления. Любое обходное решение для этого? Любая вещь, которую я делаю неправильно? Любая помощь высоко ценится.

+0

Ещё ничего ... – genaks

ответ

1

Я принимаю его потому, что didReceiveRemoteNotification: вызывается в фоновом потоке, и presentViewController, возможно, потребуется вызвать в основном потоке.

Приведенный ниже код, сил контроллер представления будет представлен в основной теме асинхронно Note: a block should never be synchronously run on the main thread. Чтобы узнать больше о Grand Central Dispatch, см. here.

dispatch_async(dispatch_get_main_queue(),^
{ 
    CDetailsViewController *viewController = [[CDetailsViewController alloc] initWithC:c]; 
    [self.navigationController presentViewController:viewController animated:YES completion:nil]; 
} 
+0

Не могли бы вы рассказать о том, что здесь происходит? – genaks

+0

все еще не работает по какой-то причине – genaks

3

Если ваше приложение в фоновом режиме, метод «Применение: didReceiveRemoteNotification:» никогда не вызывается.

Вы должны добавить это в методе: «Применение: didFinishLaunchingWithOptions:»

// At the end of the method you force call didNotification: 

// Handle any notifications. 
if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) 
{ 
    NSDictionary * aPush =[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 
    [self application:application didReceiveRemoteNotification:aPush]; 

} 


return YES; 
} 

Если запускается приложение из-за пользователем нажмите на уведомление, в то launchOptions Сыроватского, полезная нагрузка уведомление будет приложена ,

+0

Я бы добавил его, если это то, что требуется. Но я могу видеть, что 'didReceiveRemoteNotification' получает вызов в уведомлении, а мои данные доступны в 'userinfo' – genaks

Смежные вопросы