2013-10-13 5 views
1

Я пытаюсь настроить UILocalNotification на запуск каждые 30 секунд, используя следующую логику, однако, похоже, это неправильно. Есть 2 номера:UILocalNotification каждые 30 секунд

  1. Когда увольняются уведомления, похоже, их много, а не 1 раз в 30 секунд.
  2. Значок значка значка приложения, похоже, не увеличивается. Он просто остается на 1.

Возможно, кто-то поможет мне разобраться в том, что я сделал неправильно?

// Create 'base' notification we can use 
UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; 
baseNotification.timeZone = [NSTimeZone defaultTimeZone]; 
baseNotification.repeatInterval = NSMinuteCalendarUnit; 
baseNotification.alertBody = @"My Message."; 
baseNotification.alertAction = @"My Alert Action"; 
baseNotification.soundName = UILocalNotificationDefaultSoundName; 

UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.applicationIconBadgeNumber++; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; 

UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.applicationIconBadgeNumber++; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 
+0

Что вы подразумеваете под «Когда увольняются уведомления»? Вы видите сразу несколько уведомлений об оповещении, или метод 'application: didReceiveLocalNotification:' вызывается несколько раз? – Hejazi

+0

Я имею в виду, что я вижу много уведомлений о предупреждениях одновременно. –

+0

Отменяете ли вы все предыдущие запланированные оповещения, вызывая 'cancelAllLocalNotifications'? – Hejazi

ответ

1

В настоящее время нет возможности достичь пользовательских повторов с интервалами.

Однако система уведомлений может поставить в очередь до 64 уведомлений, поэтому самое ближайшее, что вы можете сделать, - это вручную установить столько уведомлений, сколько вам нужно (каждый из которых имеет другой номер для значка и другой fireDate), а затем обновите список уведомлений, установив новые, когда вы используете на них низкий уровень.

Это вернет сколько уведомлений вы имеете в очереди:

[[[UIApplication sharedApplication] scheduledLocalNotifications] count] 

Там же этот пост, что я бы рекомендовал вам читать для получения дополнительной помощи:

iOS badge number live update

Удачи!

0

Что касается второго пункта, вы увеличиваете номер значка копии, а не оригинальное уведомление. И поскольку у оригинала нулевой номер значка, вы всегда получите копию с нулевым номером значка, и увеличение будет всегда 1.

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

... 
baseNotification.applicationIconBadgeNumber++; 
UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; 

baseNotification.applicationIconBadgeNumber++; 
UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 
0

Согласно NSObject ссылки класса:

копия - возвращает объект, возвращаемый copyWithZone:

И copyWithZone возвращает неполную копию. Так что, как и все уведомления, есть те же свойства. Следовательно, номер значка всегда «1», а fireDate - для всех уведомлений. т. е. последний, который вы применяете. Следовательно, уведомления срабатывают одновременно.

Надеюсь, это помогает.

+0

Спасибо - знаете ли вы, есть ли способ, который я могу скопировать, чтобы значения не были одинаковыми? –

+1

Почему бы не создать новый экземпляр? Насколько я знаю, для создания глубокой копии, вам нужно реализовать copyWithZone: этого объекта, который не является решением в случае класса UILocalNotification. –

2

Попробуйте этот.

UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; 
baseNotification.timeZone = [NSTimeZone defaultTimeZone]; 
baseNotification.repeatInterval = NSMinuteCalendarUnit; 
baseNotification.alertBody = @"My Message."; 
baseNotification.alertAction = @"My Alert Action"; 
baseNotification.soundName = UILocalNotificationDefaultSoundName; 

UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
alertOne.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; 

UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
alertTwo.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; 
0

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

[[UIApplication sharedApplication] cancelAllLocalNotifications]; 
Смежные вопросы