1

У меня есть приложение, в котором используется XIB, а не раскадровка. Корневой контроллер - это TabBarController. Есть 5 вкладок, и каждая вкладка содержит NavigationController. То, что я хотел бы сделать, - это приложение PUSH на определенный контроллер просмотра всякий раз, когда пользователь нажимает на полученное Push-уведомление. В моем didFinishLaunchingWithOptions у меня есть (среди других настройки вещей):Контроллер Push View при получении уведомления о выходе iOS

window.rootViewController = self.tabBarController; 
    [window makeKeyAndVisible]; 

В более позднем коде:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    [PFPush handlePush:userInfo]; 
    if (application.applicationState == UIApplicationStateInactive) { 
     [self handleRemoteNotificationWithPayload:userInfo]; 
    } 
} 
-(void)handleRemoteNotificationWithPayload:(NSDictionary *)payload { 
    NSLog(@"User tapped notification"); 
    NewsViewController *dvController8 = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:[NSBundle mainBundle]]; 
     [self.tabBarController.navigationController pushViewController:dvController8 animated:YES]; 


} 

Однако, вообще ничего не происходит, когда я нажимаю на уведомление, хотя NSLog делает огнь в консоли , Предложения?

Основа ответа, у меня теперь есть

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    [PFPush handlePush:userInfo]; 
    UINavigationController *nav = (UINavigationController *) self.tabBarController.selectedViewController; 
    NewsViewController *dvController8 = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:[NSBundle mainBundle]]; 
    [nav pushViewController:dvController8 animated:YES]; 

} 

Но это работает только, если приложение уже работает приостановлено в фоновом режиме. Если он разбился, или пользователь заставил его закрыть приложение-коммутатор, он просто откроет приложение, а не нажимает контроллер.

EDIT:

Вот didFinishLaunchingWithOptions метод:

UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | 
                UIUserNotificationTypeBadge | 
                UIUserNotificationTypeSound); 



    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes 
                      categories:nil]; 

    [[UIApplication sharedApplication] 
    registerUserNotificationSettings:settings]; 
    [application registerUserNotificationSettings:settings]; 
    [application registerForRemoteNotifications]; 

ответ

3

Если каждая вкладка на вкладке контроллера навигации контроллер попробуйте это:

UINavigationController *nav = (UINavigationController *) self.tabBarController.selectedViewController; 
NewsViewController *dvController8 = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:[NSBundle mainBundle]]; 
[nav pushViewController:dvController8 animated:YES]; 

Поэтому в основном сначала получить ссылку выбранного контроллера и сделать pushViewController над выбранным контроллером представления.

EDIT, как обращаться, если приложение не работает в фоновом режиме:

, если приложение не работает в фоновом режиме, вы должны сделать это по применению: didFinishLaunchingWithOptions

В документации сказано: " если приложение не запускается при поступлении удаленного уведомления, метод запускает приложение и предоставляет соответствующую информацию в словаре параметров запуска. Приложение не вызывает этот метод для обработки этого удаленного уведомления. Вместо этого ваша реализация приложения: willFinishLaunchingWithOptions : или приложение: didFinishLaunchingWithOptions: метод должен получить данные полезной нагрузки удаленного уведомления и отреагировать соответствующим образом ».

Пожалуйста, проверьте: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:didReceiveRemoteNotification:

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

- (void)handleNotification:(NSDictionary *)userInfo { 
    UINavigationController *nav = (UINavigationController *) self.tabBarController.selectedViewController; 
    NewsViewController *dvController8 = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:[NSBundle mainBundle]]; 
    [nav pushViewController:dvController8 animated:YES]; 
} 

Отныне каждый времени вы должны обращаться с удаленного оповещения вам просто нужно вызвать метод handleNotification.

Во-вторых изменить реализацию didReceiveRemoteNotification на что-то вроде:

[self handleNotification:userInfo]; 

Наконец, добавьте следующие строки в реализации didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // your code here 


    if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) { 
     // this means we received a remote notification 
     [self handleNotification:(NSDictionary *) [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]]; 
    } 

    return YES; 
} 

Так на методе didFinishLaunchingWithOptions вы проверить, если словарь launchOptions имеет некоторый объект назначено для UIApplicationLaunchOptionsRemoteNotificationKey. Если это так, значит, приложение было открыто из удаленного уведомления. Значением, назначенным этому ключу, является полезная нагрузка уведомления.

Примечание: я не тестировал код на xcode, поэтому может иметь опечатки, но вы должны получить представление о том, как вы можете достичь того, что вам нужно.

Надеюсь, это поможет!

+0

Хорошо, я изменил это, и он открывает NewsViewController, как и ожидалось, с одной небольшой проблемой. Он делает это каждый раз, когда приложение открывается после принудительного закрытия (а не только приостановлено в фоновом режиме), а не только при нажатии на уведомление. Что может быть причиной этого? – user717452

+0

Любые идеи о том, почему это делается? – user717452

+0

Если я поместил '[self handleRemoteNotificationWithPayload: userInfo];' в метод 'didFinishLaunchingWithOptions', контроллер будет нажат каждый раз, когда приложение будет открыто, а не только при получении уведомления. Можете ли вы увидеть редактирование OP на том, как этот метод в настоящее время отображается и помогает мне? – user717452

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