Как ответить на просмотр push-уведомлений, если приложение уже работает в фоновом режиме

У меня есть кое-что довольно простое, что я хочу сделать. Я прикрепляю пользовательский фрагмент данных к некоторым push-уведомлениям, которые обрабатываю в

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Я ищу UIApplicationLaunchOptionsRemoteNotificationKey, и вот он.

Этот метод вызывается только в том случае, если мое приложение запускается впервые. Как мне прочитать тот же ключ, если мое приложение уже работает в фоновом режиме, когда приходит уведомление и пользователь нажимает кнопку «Просмотр» в уведомлении? Я хочу отправить их определенному контроллеру представления с открытыми на нем данными, так же, как я, если приложение запускается в первый раз из уведомления.


person rustyshelf    schedule 24.02.2011    source источник


Ответы (2)


Проверьте application:didReceiveRemoteNotification:fetchCompletionHandler: в iOS 7 и новее.


Метод application:didReceiveRemoteNotification: вызывается, если ваше приложение работает на переднем плане. Он также вызывается, если ваше приложение работает в фоновом режиме и пользователь взаимодействует с вашим push-уведомлением (тем самым делая ваше приложение активным).

Итак, реальный вопрос заключается в том, как определить, было ли приложение на переднем плане или оно было активировано пользователем, отправившим ваше push-уведомление.

Похоже, этот ответ на вопрос didReceiveRemoteNotification в фоновом режиме имеет ключ:

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

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if ( application.applicationState == UIApplicationStateActive )
        // app was already in the foreground
    else
        // app was just brought from background to foreground
    ...
}
person gerry3    schedule 24.03.2011
comment
Не совсем правильно сказать, что метод application: didReceiveRemoteNotification вызывается, если приложение работает в фоновом режиме. Точнее: если приложение находится в фоновом режиме, метод вызывается только после того, как пользователь задействует push-уведомление, чтобы вывести его на передний план. Если пользователь отменяет / отклоняет push-уведомление, метод делегата не вызывается. - person Martijn Thé; 07.02.2013
comment
Поскольку didRecieveRemoteNotification вызывается, когда устройство получает уведомление (разблокировано), и когда пользователь щелкает представление уведомления, становится трудно (насколько мне известно) выяснить, действительно ли пользователь щелкнул уведомление или приложение просто его получает. И проверка состояния приложения ничего не говорит вам, кроме его состояния, а не того, щелкнул ли пользователь уведомление (по моему опыту). - person Hrafn; 12.02.2013
comment
В iOS 7 с remote-notification фоновым режимом я не думаю, что этот метод больше работает, потому что приложение может обрабатывать удаленное уведомление в фоновом режиме, не выводя его на передний план. Так как же тогда узнать, перенесено ли оно с заднего на передний план? - person user102008; 26.10.2013
comment
В iOS 7 с фоновым режимом удаленного уведомления, если я убиваю свое приложение, и его больше нет в фоновом режиме, и приходит push-уведомление, я вижу баннер и значок, но я не получаю приложение обратного вызова: didReceiveRemoteNotification или приложение: didReceiveRemoteNotification : fetchCompletionHandler методы. Когда я нажимаю на значок приложения, вызывается обратный вызов application: didFinishLaunchingWithOptions, но я не получаю загрузку от [notification userInfo]. - person Bharat Dodeja; 30.05.2014
comment
Как рекомендует Apple, по возможности используйте метод application:didReceiveRemoteNotification:fetchCompletionHandler: вместо этого в iOS7 и более поздних версиях. - person Allen; 11.03.2015

Чтобы определить, было ли приложение активировано удаленным уведомлением, попробуйте следующее:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo == NULL)
    {
        NSLog(@"didFinishLaunchingWithOptions user startup userinfo: %@", userInfo);
    }
    else
    {
        NSLog(@"didFinishLaunchingWithOptions notification startup userinfo: %@", userInfo);
    }
}
person user523234    schedule 31.07.2014
comment
Это не учитывает состояние, в котором приложение запущено, а работает в фоновом режиме. Вот о чем на самом деле спрашивается вопрос. - person Jesse Naugher; 19.08.2014