UILocalNotification срабатывает после переустановки приложения

В моем приложении есть функция будильника с использованием UILocalNotification, и она прекрасно работает. Однако, если пользователь удалит приложение, а затем переустановит его, он получит все «промежуточные» уведомления сразу.

Я попытался позвонить:

[[UIApplication sharedApplication] cancelAllLocalNotifications];

если это первый раз, когда приложение запускается, но это не помогает, потому что уведомление получено еще до вызова application:didFinishLaunchingWithOptions:.

В версии 4.0 ситуация была хуже, когда тревога повторялась, даже если пользователь удалил приложение, но, по крайней мере, эта ошибка была исправлена ​​Apple в более позднем выпуске. Однако теперь я застрял с этим. У кого-нибудь есть идея?


person Enzo Tran    schedule 07.02.2011    source источник
comment
Привет, у тебя есть решение этой проблемы...   -  person Nik's    schedule 27.07.2012


Ответы (2)


На самом деле это ошибка в iPhone. Если вы удалили приложение и установили его позже, оно будет иметь тот же идентификатор приложения, поэтому при переустановке приложения все прошлые локальные уведомления срабатывали, даже если вы не открывали приложение.

person KingofBliss    schedule 07.02.2011
comment
Для пользователей iOS 4.0, 4.1... как вы думаете, есть ли обходные пути? Потому что будет очень неприятно получать эти повторяющиеся сигналы тревоги, не отключая их (4.0). - person Enzo Tran; 07.02.2011
comment
другого пути нет, вот почему они зарегистрировали ошибку - person KingofBliss; 07.02.2011
comment
Я все еще вижу это поведение с версии 4.3, особенно при запуске (установке) через XCode. - person Gregir; 14.09.2011
comment
И я до сих пор вижу это поведение при запуске приложения в iOS 6.0.1! - person Giovanni; 17.12.2012
comment
Может ли кто-нибудь опубликовать ссылку на отчет об ошибке в Apple, касающийся этой ошибки? Как сказал @niraj, я также вижу это в iOS 6.0. - person Kenn Cal; 18.01.2013

По словам Apple, это не ошибка (я подал отчет об ошибке). Система сохраняет UILocalNotifications для удаленных приложений в течение 24 часов на тот случай, если пользователь случайно удалил приложение, и восстанавливает указанные UILocalNotifications, если приложение переустанавливается в течение этого периода времени.

Решением будет удаление всех UILocalNotifications при первом запуске, например:

- (BOOL)          application: (UIApplication*) application
didFinishLaunchingWithOptions: (NSDictionary*)  launchOptions
{
  if (self.isFirstRun)
  {
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
    self.firstRun = NO;
  }

  /* Other code here */
  ...
}

конечно, реализовать свой собственный сеттер и геттер firstRun для извлечения/сохранения в постоянное хранилище, например NSUserDefaults.

person Kenn Cal    schedule 25.02.2013
comment
Эта функция где-нибудь задокументирована? - person race_carr; 07.04.2014
comment
+1 Это выглядит довольно глупо. Приложение не владеет уведомлениями после того, как они переданы ОС, что становится ясно, когда вы пытаетесь запланировать 65 уведомлений вместо максимум 64. Приложение должно нести ответственность за хранение своего собственного представления того, что означает уведомление. --не полагаться на ОС. Если такое приложение запускается без предварительного знания этих уведомлений, то они просто мусор. - person Andreas; 27.05.2015