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

<p>я отправляю push-уведомления в свое приложение для iphone, и мне хотелось бы выполнить другой набор инструкций в зависимости от того, запущено ли уже приложение или нет. я новичок в разработке для iphone, и хотя я подозреваю, что uiapplication или класс appdelegate моего проекта имеет решение, я не нашел хорошего ответа. есть ли простой способ проверить это?</p>

<p>у делегата uiapplication есть метод</p><pre><code>- (void)application:(uiapplication *)application didreceiveremotenotification:(nsdictionary *)userinfo </code></pre><p>который вам нужно реализовать. это получает уведомление, когда приложение работает.</p><p>если ваше приложение в данный момент не запущено и получено уведомление, его можно запустить с</p><pre><code>- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions </code></pre><p>с подробностями уведомления в словаре launchoptions. если словарь равен нулю, пользователь нажимает на значок приложения как обычно.</p>

<blockquote> <p>вот более подходящий способ обработки активного/неактивного состояния приложения.</p> </blockquote><pre><code>- (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; } </code></pre><p><code>didreceiveremotenotification:</code> вызывается, когда приложение работает, да, но когда оно приостановлено, <code>ios</code> заботится о поднятии значка и т. д. если приложение находится на переднем плане, ос ничего не делает и просто вызывает ваш <code>didreceiveremotenotification:</code>.</p>

<p>в зависимости от того, что вы подразумеваете под "запущен", вы либо ищете:</p><ul> <li>ответ кевина выше (различает запущенный или не запущенный)</li> <li>или это (различает приостановленный или активный, но уже запущенный):</li> </ul><p>используйте флаг, установленный как true, когда приложение становится активным, и false, когда приложение не активно.</p><p>флаг (в заголовочном файле [.h]):</p><pre><code>bool applicationisactive; </code></pre><p>код (в файле реализации [.m]):</p><pre><code>- (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 } </code></pre><p>это работает, потому что, когда приложение приостановлено, ос вызывает "applicationdidreceiveremotenotification", прежде чем оно вызывает "applicationdidbecomeactive" во время процесса "пробуждения".</p><p>"полный" ответ на самом деле является ответом кевина плюс этот ответ.</p><p>надеюсь это поможет.</p>

<p>если вы собираетесь проверить applicationstate на ios менее 4, вам нужно убедиться, что applicationstate поддерживается:</p><pre><code>if ([application respondstoselector:@selector(applicationstate)] ){ // safe to check applicationstate uiapplicationstate state = [application applicationstate]; } </code></pre>

<p>документация apple для push-уведомлений объясняет это:</p><blockquote> <p>однако есть две ситуации, когда applicationdidfinishlaunching: не является подходящим сайтом реализации:</p> <ul> <li>приложение работает, когда приходит уведомление.</li> <li>полезная нагрузка уведомления содержит пользовательские данные, которые может использовать приложение.</li> </ul> <p>в первом случае, когда приложение работает, когда iphone os получает удаленное уведомление, вы должны реализовать приложение: didreceiveremotenotification: метод uiapplicationdelegate, если вы хотите немедленно загрузить данные. после загрузки обязательно удалите значок со значка приложения. (если ваше приложение часто проверяет у своего провайдера новые данные, реализация этого метода может не потребоваться.)</p> </blockquote><p>это означает, что если ваше приложение: didreceiveremotenotification: метод делегата вызвано, ваше приложение работает.</p>