Управление несколькими UILocalNotification - PullRequest
1 голос
/ 17 июля 2010

Я занимаюсь разработкой приложения, которое из-за того, что я не могу использовать пользовательский интервал времени для планирования локальных уведомлений, должно создать N локальных уведомлений для имитации временного расписания.Приложение делает это один раз для всех X-объектов (на данный момент давайте назовем их календарными событиями).Таким образом, пользователь может иметь 100 событий календаря, каждое из которых имеет 20 локальных уведомлений, чтобы напоминать пользователю один раз каждые несколько минут / дней / недель / что угодно.

Вот где это становится сложным: Допустим, одно из этих уведомлений отключается 2минут, а через 3 минутыСкажем, я игнорирую первый, но нажмите кнопку действия, чтобы перейти к приложению на втором.Мой метод-обработчик didFinishLaunchingWithOptions: делегат приложения не вызывается;приложение идет прямо на домашний экран.Единственный способ, которым я могу получить способ ответить на приложение, загружаемое таким образом, - это applicationDidBecomeActive:.

Как я могу обработать эти уведомления?Даже в applicationDidBecomeActive: я не могу получить доступ к уведомлениям через [[UIApplication sharedApplication] scheduleLocalNotifications], потому что они, кажется, очищаются до вызова этого метода.

Спасибо!

1 Ответ

10 голосов
/ 20 октября 2010

Несколько замечаний:

Максимальное количество UILocalNotification

Вы указали сценарий, что для каждого «календарного события» потребуется около 20 локальных уведомлений, и вы ожидаете, что обычный пользователь будет иметь додо 100 календарных событий.Это сделало бы 2000 UILocalNotification.Вы можете заметить, что iOS4 ограничивает количество UILocalNotification до 64 для каждого приложения.

См .: Справочник по классам UILocalNotification

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


Обработка UILocalNotification

Начиная с iOS4, приложения больше не запускаютсяисключительно через приложение: didFinishLaunchingWithOptions:

application: didFinishLaunchingWithOptions: вызывается только один раз, когда приложение запускается из не фонового состояния (например, первый запуск пользователем, предыдущий запуск был остановлен iOS для сохранения памяти, пользовательубил приложение из панели многозадачности, устройство было перезапущено).

Таким образом, на самом деле есть три различных сценария для рассмотрения обработки UILocalNotification в iOS4 (где была введена многозадачность).

Когда вашПриложение работает в фоновом режиме, место для обработки уведомлений - через приложение: didReceiveLocalNotification:, которое запускается в двух сценариях:

  1. Когда пользователь нажимает кнопку действия «Просмотр», чтобы «запустить» ваше приложение изуведомление о предупреждении, когда ваше приложение имеет фон
  2. Когда уведомление запускается, когда ваше приложение работает на переднем плане.

application: didFinishLaunchingWithOptions: обрабатывает только один сценарий:

  1. Когда пользователь нажимает кнопку действия «Просмотр», чтобы запустить приложение из уведомления о предупреждении, когда ваше приложение не работает в фоновом режиме

Устройства, которые не поддерживаютмногозадачность (например, iPhone 3G) вообще не будет использовать сценарий 1, а исключительно сценарий 3.

В сценарии 2 вы обрабатываете свое собственное уведомление, включая отображение любого соответствующего UIAlertView или выполнение каких-либо действий.


Теперь, последнее, что следует отметить, это то, что уведомления, которые запускаются, когда приложение не запущено на переднем плане и игнорируются пользователем (т.е.пользователь не нажал кнопку действия «Просмотр») не вызовет сценарий 1 или 3. Они не будут отправлять уведомление вашему приложению вообще при последующих запусках.

Вы правы в том, чтоВы больше не можете получить доступ к этим уведомлениям через [[UIApplication sharedApplication] scheduleLocalNotifications], потому что они уже истекли на момент уведомления.

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

...