2015-04-05 1 views
0

У меня есть приложение, которое должно загружает ViewController когда приходит дистанционное уведомление толчок, у меня есть этот код в настоящее время в моем appDelegate.m:Реализовать didReceiveRemoteNotification, чтобы показать новый ViewController, когда дело доходит

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    NSLog(@"REMOTE NOTIFICATION %@", userInfo); 
    if([[MTMAPIClient sharedClient] isLoggedIn: nil]){ 
     if (userInfo && userInfo[@"aps"] && userInfo[@"aps"][@"extra"]) { 
      if (application.applicationState == UIApplicationStateActive) { 
       [self playSound]; 
      } 
     } 

     [NotificationHelper pushNotificationCame:userInfo view:self.tabBarController.selectedViewController]; 
    } 
} 

Мое приложение (например, AppStore и iTunes), в котором я сохраняю ссылку на UITabBarController в своем приложении appDelegate.

Мой Уведомление Helper код:

+ (void) pushNotificationCame:(NSDictionary*)userInfo view:(UINavigationController*) viewController 
{ 
    NSString* otp; 
    if (userInfo && userInfo[@"aps"] && userInfo[@"aps"][@"extra"]) { 

     otp = (NSString*)userInfo[@"aps"][@"extra"][@"otp"]; 


     [Authorization loadAuthByOtp:otp 
          success:^(Authorization *auth) { 
           dispatch_async(dispatch_get_main_queue(), ^{ 
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryBoard" bundle:[NSBundle mainBundle]]; 
            TransactionDetailViewController* appTransactionDetailsView = [storyboard instantiateViewControllerWithIdentifier:@"transactionDetails"]; 
            appTransactionDetailsView.authorization = auth; 
            [viewController pushViewController:appTransactionDetailsView animated:YES]; 
           }); 

          } failure:^(NSString *error, ErrorType errorType) { 
           NSLog(@"pushNotificationCame loadAuthByOtp failed with error: %@", error); 
          }]; 
    } 
} 

Это работает в 70% случаях, но иногда, когда я выйти из приложения и подписать обратно, когда толчок уведомление приходит self.tabBarController.selectedViewController и " viewController "в методе pushNotificationCame не является текущим активным видом в моей панели вкладок, поэтому PushViewController не работает.

Другими словами, в моей вкладке приложения A, B, C есть три вкладки, когда появляется push-уведомление. Я нахожусь на вкладке A, но self.tabBarController.selectedViewController в отладчике является B viewController, поэтому, когда я нажимаю новый viewController, он идет на вкладку B, и ничего не происходит. нет ошибки, но нет нового viewController. это происходит только тогда, когда я выхожу и пью обратно в приложение, как правило, это просто работает!

Мой Выход код:

[viewController.navigationController.tabBarController performSegueWithIdentifier:@"logoutSegue" sender:viewController]; 

и мой знак в коде:

[self performSegueWithIdentifier:@"fromSignInToApplications" sender:self]; 

который переводит пользователя на первой вкладке в TabBarController.

и AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.tabBarController = (UITabBarController *)self.window.rootViewController; 
} 
+0

Что вы будете делать, когда вы выйдете из системы/войдите в систему? Правильно ли 'self.tabBarController'? – Wain

+0

@Wain Я отредактировал сообщение, чтобы включить детали, которые вы просили. –

ответ

1

Похоже, проблема в том, что вы строите стек контроллеров отображения, когда вы выйти из системы/логина так в корне стеки у вас есть оригинальный контроллер вида вкладки и то у вас есть выход, затем вход в систему, а затем новый контроллер представления табуляции. На данный момент делегат приложения все еще имеет ссылку на исходный контроллер представления таблиц, и ничего больше не работает.

(обратите внимание, вы не можете иметь контроллер представления выхода из системы, но принцип применим и для контроллера представления Логин)

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

Альтернативный вариант состоит в том, чтобы после регистрации ввести уведомление о входе, поэтому делегат приложения может получить новый контроллер представления таблиц, но он не является контроллером представления окон, поэтому вам нужно будет внести некоторые изменения или подумать о том, как это сработает.

+0

В отладочном окне, похоже, это указывает на тот же адрес указателя в обоих случаях я вижу: 0x12560ac20 \t 0x000000012560ac20 –

+0

вы были правы я исправил проблему, направив уведомление при подписании в и обновлении ссылки на tabBarController: '- (Недействительными) tabBarControllerChanged: (NSNotification *) уведомление { self.tabBarController = (UITabBarController *) notification.userInfo [@ "tabBar"]; } ' –

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