Проверка ожидающих уведомлений

#objective-c #ios #push-notification

#objective-c #iOS #push-уведомление

Вопрос:

С iOS 5 и центром уведомлений у вас могут быть ожидающие, накопленные уведомления, каждое со своими данными и сообщениями. Есть ли способ при регулярном запуске вашей программы (без нажатия на уведомление) обнаруживать ожидающие уведомления и, что более важно, связанные с ними данные?

Другой вопрос, связанный с этим, заключается в том, что когда приходят push-уведомления, а ваше приложение находится в фоновом режиме, все application:didReceiveLocalNotification: равно вызывается или оно просто идет и ждет, пока приложение не будет запущено, а затем вы должны вручную обработать его с помощью данных запуска в application:didFinishLaunchingWithOptions:

Мой сценарий заключается в том, что мне нужно обновить некоторые модели основных данных с данными, прикрепленными к push-уведомлениям, поэтому я хочу, чтобы эти изменения отражались независимо от того, как они запускают приложение.

Ответ №1:

По моему опыту, нет другого способа узнать об уведомлениях, кроме как запустить приложение непосредственно через них (на iOS 5 это будет сразу после получения уведомления или из уведомлений в очереди, присутствующих в Центре уведомлений).).

Альтернативной стратегией было бы использование значков значков.

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

Ответ №2:

Когда появляется уведомление, вы можете либо просмотреть его, либо отменить. Если пользователь отменил уведомление, вы можете проверить их при следующем входе в приложение:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

    if( localNotif )    {
        // Do some stuff
        application.applicationIconBadgeNumber = 0;  // Reset num of notifications on app icon
    }
}
 

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

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

BOOL inApp = [application applicationState] == UIApplicationStateActive;

    if( inApp ) { // they got this in the app
        //Do some stuff in the app
    }
    else {
        // They acknowledged the notification out of the app and here they are
        // Do some other stuff
    }

    application.applicationIconBadgeNumber = 0;
}
 

Это дает вам хорошее покрытие для всех сценариев с локальными уведомлениями, которые будут:

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