UILocalNotification: обновление BadgeNumber во время repeatInterval - PullRequest
0 голосов
/ 19 января 2011

После 2-х дней, проведенных за игрой в глаза, я не мог найти никакого решения, как будто оно понятно всем (кроме меня)!

Мне нужно:

Alert.applicationIconBadgeNumber = x  

для обновления в фоновом режиме при каждом срабатывании уведомления, я повторяю уведомление по:

notif.repeatInterval = NSMinuteCalendarUnit  

Повтор работает нормально каждые 1 м. когда приложение переходит в фоновый режим, но обновление BadgeNumber обновляется, оно принимает только 1-е обновленное значение даты.

Я вызываю метод scheduleNotification by viewDidLoad

Вот мой полный код:

- (void)scheduleNotification {
UILocalNotification *notif;
notif = [[[UILocalNotification alloc] init] autorelease];
notif.timeZone = [NSTimeZone defaultTimeZone];
notif.fireDate = [[NSDate date] dateByAddingTimeInterval:5];
notif.repeatInterval = NSMinuteCalendarUnit; 

NSInteger BadgeNumber = [self BadgeNumber];
NSInteger *BadgeNumberPointer = &BadgeNumber;
NSString *BadgeNumberString = [NSString stringWithFormat:@"%i", BadgeNumber];

notif.applicationIconBadgeNumber = *BadgeNumberPointer;

notif.alertBody = BadgeNumberString;
notif.alertAction = @"Hello";

[[UIApplication sharedApplication] scheduleLocalNotification:notif];
}

-(int)BadgeNumber{
NSDate *currentDateUpdate = [[NSDate alloc] init];
NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
[formatter2 setDateFormat:@"dd"];
NSString *dateCheckUpdate = [formatter2 stringFromDate:currentDateUpdate];
NSInteger dateCheckUpdateInt = [[dateCheckUpdate substringWithRange:NSMakeRange(0, 2)] integerValue];

int BadgeNumber = dateCheckUpdateInt;
return BadgeNumber;
}

Добрый совет, как это исправить, спасибо всем вам.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Я знаю, что на этот вопрос уже есть ответ, но вы можете использовать NSUserDefaults в качестве средства кэширования счетчика значков. Тогда в applicationIconBadgeNumber вы можете просто использовать что-то вроде этого:

notif.applicationIconBadgeNumber = ([NSUserDefaults standardUserDefaults] integerForKey:@"badgeCount"] + 1);

и тогда вы можете просто сбросить его, когда пользователь ответит соответствующим образом.

1 голос
/ 19 января 2011

Поскольку операционная система копирует уведомление по расписанию, данные в уведомлении не обновляются, поэтому номер значка приложения не изменяется.

Возможно, если вы не будете повторять уведомление, а создаете свое собственное новое уведомление для каждого временного интервала, это даст вам необходимое поведение.Единственный способ, с помощью которого я могу создать такие уведомления, - это опубликовать несколько уведомлений в вашем методе scheduleNotification, а затем не забывать удалять уведомления, когда пользователь отвечает соответствующим образом.Поскольку ОС запоминает только следующие 64 хронологически запланированных уведомления, вы можете запланировать только около часа.Поскольку номер вашего значка, по-видимому, является текущей датой, вы можете проверить время и потрудиться установить столько уведомлений, если вы находитесь в течение часа после полуночи.

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

...