IOS как судить приложение работает на переднем плане или на заднем плане?

Как мы все знаем, если приложение iOS работает на переднем плане, приложение не будет уведомлять пользователей о появлении уведомления об удалении. Теперь в моем приложении я хочу показать предупреждение для уведомления пользователей о том, что приходит удаленное уведомление. Как определить, работает ли приложение на переднем плане или в фоновом режиме? Я нашел документы и искал stackoverflow.com и не смог найти ничего об этом. Спасибо.

Ответ 1

[UIApplication sharedApplication].applicationState будет возвращать текущее состояние, проверять его возможные значения и не создавать ненужные флаги, когда вы можете использовать системные функции.

Значения, которые вы можете рассмотреть:

  • UIApplicationStateActive
  • UIApplicationStateInactive
  • UIApplicationStateBackground

например.

+(BOOL) runningInBackground
{
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    return state == UIApplicationStateBackground;
}

+(BOOL) runningInForeground
{
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    return state == UIApplicationStateActive;
}

Ответ 2

Бывают случаи, когда проверка состояния не работает.

Вот один из тех, с которыми я столкнулся: если вы попытаетесь использовать BT и он отключен, iOS откроет диалоговое окно с вопросом, хотите ли пользователь включить BT. Когда это произойдет, состояние приложения не является надежным способом определить, находится ли ваше приложение на переднем плане.

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

UIApplication.applicationState будет говорить "Активный", хотя это не так (по крайней мере, если вы интерпретируете "активный" как находящийся на переднем плане, как и исходный вопрос).

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

applicationDidFinishLaunching
applicationWillEnterForeground

и false:

applicationDidEnterBackground
applicationWillResignActive