Как перенаправить на определенный контроллер представления из push-уведомлений, когда приложение находится в режиме завершения - PullRequest
0 голосов
/ 27 июня 2019

Мне нужно перенаправить приложение на определенный контроллер представления из полученного push-уведомления. Но все же я не могу понять, какой метод делегата будет вызван. Пожалуйста, руководство.

Ниже приведен код, который я пробовал до сих пор. я пробовал в didFinishLaunchingWithOptions, но не работает.

 if (launchOptions) { //launchOptions is not nil
    NSDictionary *userInfo = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    NSDictionary *apsInfo = [userInfo objectForKey:@"aps"];

    if (apsInfo) { //apsInfo is not nil
        [self performSelector:@selector(notificationClickedInNotificationPanel:)
                   withObject:userInfo
                   afterDelay:1];
    }
}

Ответы [ 4 ]

1 голос
/ 28 июня 2019

Я сделал что-то совсем недавно, но это в Swift, но должно быть очень похоже, если вы хотите сделать это в OC.

Подсказка: didReceiveRemoteNotification не будет вызваноесли ваше приложение завершено, единственный вызванный метод - didFinishLaunchingWithOptions

Внутри didFinishLaunchingWithOptions вы можете сделать что-то вроде этого

if let launchOpts = launchOptions as [UIApplication.LaunchOptionsKey: Any]? {
            if let notificationPayload = launchOpts[UIApplication.LaunchOptionsKey.remoteNotification] as? NSDictionary {

                 let apsBody = notificationPayload["aps"] as? NSDictionary
                 if(apsBody != nil){
                 // here you can either read value from the `apsBody` dictionary 
                //OR just push the respective controller you want to push
                 }
            }
        }else{
           //go with the regular flow
        }

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

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

1 голос
/ 27 июня 2019
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

// Called when App is in Foreground // Using the data received in the notification you can call the desired view controller

    completionHandler([.alert, .badge, .sound])
}

и

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

// Called when App is not in  Foreground // Using the data received in the notification you can call the desired view controller
    completionHandler()
}
0 голосов
/ 28 июня 2019

Когда приложение убито, вы можете найти полезные данные push-уведомлений из launchOptions

. Вот ссылка для получения дополнительной информации: https://developer.apple.com/documentation/uikit/uiapplication/launchoptionskey/1622967-remotenotification

0 голосов
/ 28 июня 2019

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions != nil)
    {
        NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (dictionary != nil)
        {

            self.animal_id = [dictionary objectForKey:@"animal_id"];
            self.notificationText = [dictionary objectForKey:@"alert"];
            self.soundFile = [dictionary objectForKey:@"sound"];

            if ([self.animal_id length] > 0) {

                NSInteger numberOfBadges = [UIApplication sharedApplication].applicationIconBadgeNumber;
                numberOfBadges -=1;

                if (numberOfBadges < 0) {
                    numberOfBadges = 0;
                }

                [[UIApplication sharedApplication] setApplicationIconBadgeNumber:numberOfBadges];

                doNotShowAlert = YES;
                [self showPetDetails:self.animal_id];
            } else {
                doNotShowAlert = NO;
            }

        }

    }

    return YES;
}

и здесь:

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo
{

    NSInteger numberOfBadges = [UIApplication sharedApplication].applicationIconBadgeNumber;
    numberOfBadges -=1;

    if (numberOfBadges < 0) {
        numberOfBadges = 0;
    }

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:numberOfBadges];

    self.animal_id  = [userInfo objectForKey:@"animal_id"];

    NSDictionary *aps = [userInfo objectForKey:@"aps"];

    self.notificationText = [aps objectForKey:@"alert"];
    self.soundFile = [aps objectForKey:@"sound"];

   [self showPetDetails:self.animal_id];
}

showPetDetails отправляется в базу данных, чтобы получить подробную информацию для отображения. Когда он есть, он вызывает другой метод для отображения подробного представления:

PetDetailViewController *notificationController = [self.rootNavigationController.storyboard instantiateViewControllerWithIdentifier:@"petdetail"];
notificationController.petDetail = petDetail;
notificationController.currentImage = nil;

[self.rootNavigationController pushViewController:notificationController animated:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...