Определить, получило ли приложение фокус из-за UILocalNotification - PullRequest
7 голосов
/ 03 октября 2011

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

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

У кого-нибудь есть идеи?

Ответы [ 6 ]

13 голосов
/ 05 октября 2011

«Правильный» способ сделать это - проверить свойство applicationState вашего NSApplication в приложении: didReceiveRemoteNotification: метод вашего делегата.

Из документации для обработки локальных уведомлений:

iOS Примечание: в iOS вы можете определить, запущено ли приложение в результате нажатия пользователем кнопки действия или уведомление было доставлено в уже запущенное приложение изучение состояния заявки. В реализации делегатом приложение: didReceiveRemoteNotification: или application: didReceiveLocalNotification: метод, получить значение Свойство applicationState и оцените его. Если значение UIApplicationStateInactive, пользователь нажал кнопку действия; если значение UIApplicationStateActive, приложение было самым передним, когда получено уведомление.

Это похоже на ваше решение с использованием флагов, установленных в applicationWillEnterForeground и applicationDidBecomeActive, но с поддержкой системы.

13 голосов
/ 03 октября 2011

Я не знаю, был ли мой вопрос неясным, но, похоже, я получил 4 разных ответа, которые все неверно истолковали мой вопрос: P

Однако я обнаружил, что didReceiveLocalNotivication происходит между willEnterForeground и didBecomeActive, поэтому ясделал это, чтобы определить, было ли приложение уже открыто или нет:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    NSLog(@"Opened from notification? %@", wasInactive ? @"yes!" : @"no!");
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    wasInactive = YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    wasInactive = NO;

}
0 голосов
/ 03 октября 2011

В вашем приложении делегат в этом методе:

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

Вы должны изучить параметры запуска, глядя на этот ключ:

UIApplicationLaunchOptionsLocalNotificationKey

Когда вы ужеактивным это будет называться:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
0 голосов
/ 03 октября 2011

Если ваше приложение уже запущено, вы получите это сообщение делегата о делегате приложения

application:didReceiveLocalNotification:

Если он не работал, вам придется использовать

application:didFinishLaunchingWithOptions:

Вы должны ответить соответствующим образом в обоих методах, чтобы охватить все случаи

ОБНОВЛЕНО

Чтобы определить, активировал ли пользователь кнопку действия, требуется немного больше сложности. Мы можем сказать, что application:didFinishLaunchingWithOptions: будет иметь локальное уведомление в качестве опции запуска, но это сложнее с application:didReceiveLocalNotification:.

Поскольку приложение становится активным после того, как пользователь нажимает кнопку, мы должны отложить, пока не увидим это сообщение (или нет). Установите NSTimer в application:didReceiveLocalNotification и отмените его в didBecomeActive. Это означает, что пользователь нажал кнопку действия. Если таймер не отменен, пользователь был внутри приложения, когда оно было запущено.

0 голосов
/ 03 октября 2011

Просмотрите документацию для ключей опции запуска UIApplication. Последний параметр вашего приложения: didFinishLaunchingWithOptions: метод делегата содержит необходимую информацию.

Кроме того, посмотрите на приложение: didReceiveLocalNotification .

0 голосов
/ 03 октября 2011

Вы ищете

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

или

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...