it-swarm.com.ru

Как узнать, запущено ли приложение iPhone при получении Push-уведомления?

Я отправляю push-уведомления в свое приложение для iPhone, и мне хотелось бы выполнить другой набор инструкций в зависимости от того, запущено ли уже приложение или нет. Я новичок в разработке для iPhone, и хотя я подозреваю, что UIApplication или класс AppDelegate моего проекта имеет решение, я не нашел хорошего ответа. Есть ли простой способ проверить это?

29
thebossman

У делегата UIApplication есть метод

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

который вам нужно реализовать. Это получает уведомление, когда приложение работает.

Если ваше приложение в данный момент не запущено и получено уведомление, его можно запустить с

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

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

18
Kevin

Вот более подходящий способ обработки активного/неактивного состояния приложения.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {   
        // check for the app state
        UIApplicationState state = [application applicationState];

        if (state == UIApplicationStateActive) {
            //the app is in the foreground, so here you do your stuff since the OS does not do it for you
            //navigate the "aps" dictionary looking for "loc-args" and "loc-key", for example, or your personal payload)
        }

    application.applicationIconBadgeNumber = 0;
}

didReceiveRemoteNotification: вызывается, когда приложение работает, да, но когда оно приостановлено, iOS заботится о поднятии значка и т. д. Если приложение находится на переднем плане, ОС ничего не делает и просто вызывает ваш didReceiveRemoteNotification:.

76
Marco Papa

В зависимости от того, что вы подразумеваете под "запущен", вы либо ищете:

  • Ответ Кевина выше (различает запущенный или не запущенный)
  • или это (различает приостановленный или активный, но уже запущенный):

Используйте флаг, установленный как true, когда приложение становится активным, и false, когда приложение не активно.

Флаг (в заголовочном файле [.h]):

BOOL applicationIsActive;

Код (в файле реализации [.m]):

- (void)applicationDidBecomeActive:(UIApplication *)application {
    applicationIsActive = YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    applicationIsActive = NO;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if (applicationIsActive) {
        // Handle notification in app active state here
    }
    else {
        // Handle notification in app suspended state here
    }

Это работает, потому что, когда приложение приостановлено, ОС вызывает "applicationDidReceiveRemoteNotification", прежде чем оно вызывает "applicationDidBecomeActive" во время процесса "пробуждения".

"Полный" ответ на самом деле является ответом Кевина плюс этот ответ.

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

26
Peter

Если вы собираетесь проверить applicationState на iOS менее 4, вам нужно убедиться, что applicationState поддерживается:

if ([application respondsToSelector:@selector(applicationState)] ){
  // Safe to check applicationState
  UIApplicationState state = [application applicationState];
}
6
ddiego

Документация Apple для push-уведомлений объясняет это:

Однако есть две ситуации, когда applicationDidFinishLaunching: не является подходящим сайтом реализации:

  • Приложение работает, когда приходит уведомление.
  • Полезная нагрузка уведомления содержит пользовательские данные, которые может использовать приложение.

В первом случае, когда приложение работает, когда iPhone OS получает удаленное уведомление, вы должны реализовать приложение: didReceiveRemoteNotification: метод UIApplicationDelegate, если вы хотите немедленно загрузить данные. После загрузки обязательно удалите значок со значка приложения. (Если ваше приложение часто проверяет у своего провайдера новые данные, реализация этого метода может не потребоваться.)

Это означает, что если ваше приложение: didReceiveRemoteNotification: метод делегата вызвано, ваше приложение работает.

2
Adrian Kosmaczewski