2013-03-26 2 views
1

Я хочу запустить UILocalNotification в конкретную дату. Если я использую этот код:Пожар UILocalNotification в конкретную дату

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]]; 

[components setHour:4]; 
[components setMinute:0]; 

NSDate *fireDate = [gregorian dateFromComponents:components]; 

Если теперь это 3 вечера это работает отлично, но это не делает, когда, например, это 5 мкм.

Как установить дату пожара уведомления на «следующие 16 часов»?

+0

: - Вы хотите, чтобы автоматически повторять тревогу каждый час? Как вы хотите настроить будильник? –

+1

Я хочу только уведомить пользователя о конкретном часе, что он может делать в приложении. Уведомление не должно повторяться. Спасибо за ответ. – Lolloz89

+0

Насколько я понимаю, вы хотите повторять уведомление каждый день в определенный час? –

ответ

4
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[NSDate date]]; 

[components setHour:4]; 
[components setMinute:0]; 

NSDate *fireDate = [gregorian dateFromComponents:components]; 
NSLog(@"Fire date : %@",fireDate);// Today 4pm is already passed. So you wont get notification 

// You need to check if the time is already passed 
if ([fireDate compare:[NSDate date]] == NSOrderedAscending) 
{ 
    // Schedule it for next day 4pm 
    components.day = components.day+1; 
    fireDate = [gregorian dateFromComponents:components]; 
} 
NSLog(@"Fire date : %@",fireDate); 
+0

Это кажется хорошей идеей, но что, если я установил 30 как components.day и это февраль? Возвращает ли дата из компонентов 1 или 2 марта? – Lolloz89

+0

Невозможно установить 'components.day' в 30 для FEB. Вы просто добавляете один день до настоящего дня, если дата была передана. Предположим, что дата - feb28 через 5pm после добавления одного в 'components.day', день будет Mar1st, а не Feb29. Проверьте, изменив системное время –

+0

Отлично, я попробую этот код, и если он сработает, я приму свой ответ! Благодаря! – Lolloz89

1

Попробуйте следующий код с 24-часовым форматом: -

NSDate *date = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date]; 
[components setHour:16]; 
[components setMinute:0]; 
[components setSecond:0]; 

NSDate *newDate = [gregorian dateFromComponents: components]; 
[gregorian release];  

UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
localNotif.fireDate = newDate; 
localNotif.alertBody = [NSString stringWithFormat:@"Alarm for time : %@",newDate]; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 
[localNotif release]; 
+0

Прошу прощения, но если это 5 вечера, этот код создает дату раньше, чем этот момент, в тот же день, но на час раньше .. Поэтому я считаю, что уведомление никогда не будет показано, верно? – Lolloz89

+0

@ Lolloz89: - Вы правы. Но если вы хотите снова протестировать его, вы можете установить время и дату устройства по своему усмотрению. –

Смежные вопросы