Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

- (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:.

Ответ 3

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

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

Используйте флаг, который устанавливается 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" во время процесса "пробуждения".

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Это означает, что если ваше приложение: didReceiveRemoteNotification: метод delegate вызывается, ваше приложение запущено.