iOS устанавливает локальное уведомление в определенный день

Я уверен, что этот вопрос где-то дублируется, но я не могу найти решение. Я делаю приложение, в котором одна функция позволяет пользователю выбирать дни и время, когда они будут получать локальное уведомление.

Они могут выбрать любое время дня, которое им нравится, и могут переключать разные дни недели (пн, вт, ср и т. д.). Уведомления будут приходить еженедельно. Поэтому я ограничиваю пользователя созданием только 3 уведомлений - если выбраны все 7 дней, я установлю repeatInterval на ежедневное (одно уведомление). Если для каждых 3 уведомлений выбрано 6 дней, то мне потребуется отдельное уведомление на каждый день (всего 3x6=18 уведомлений). Скорее всего, будет использоваться только 1 уведомление, так что это нормально.

Я знаю, как установить уведомление на определенное время в будущем, но как установить уведомление, скажем, на 18:00 понедельника?

Ниже приведен мой код, который я использовал для тестирования. Он устанавливает оповещение на 4 секунды в будущем (я звонил из applicationDidEnterBackground).

    NSDateComponents *changeComponent = [[NSDateComponents alloc] init];
    changeComponent.second = 4;

    NSCalendar *theCalendar = [NSCalendar currentCalendar];
    NSDate *itemDate = [theCalendar dateByAddingComponents:changeComponent toDate:[NSDate date] options:0];

    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    localNotif.fireDate = itemDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];
    localNotif.repeatInterval = NSWeekdayCalendarUnit;

person Patrick    schedule 09.10.2013    source источник
comment
@ Патрик, rmaddy: Ребята, вы нашли какое-нибудь решение по этому поводу?   -  person Suhas Arvind Patil    schedule 11.03.2016


Ответы (4)


Точно так же, как вы делаете сейчас, но создайте дату по-другому:

NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:1];
[comps setMonth:1];
[comps setYear:2013];
[comps setHour:10];
[comps setMinute:10];
[comps setSecond:10];
localNotif.fireDate = [[NSCalendar currentCalendar] dateFromComponents:comps];
person Grzegorz Krukowski    schedule 09.10.2013
comment
Хм, так это устанавливает оповещение на 1 января 2013 года в 10:10:10? Интересно, что произойдет, если установить для него дату в прошлом... и если он настроен на еженедельное повторение, он будет автоматически срабатывать каждый вторник (поскольку это был день 01.01.13)? О, это действительно работает. Я могу использовать NSWeekdayCalendarUnit для повторения в будние дни и NSWeekCalendarUnit, чтобы setDay имел некоторый эффект. Великолепно! - person Patrick; 09.10.2013
comment
Если вы установите дату в прошлом, я думаю, что уведомление будет выполнено сразу же, в тот же момент, когда вы его инициализируете. Если приложение работает - пользователь ничего не увидит - ваше приложение получит уведомление об этом. - person Grzegorz Krukowski; 10.10.2013

Я также искал об этом. Ниже код работает хорошо для меня. Передайте значение дня недели от 1 до 7 с воскресенья по субботу и тело уведомления с действием, которое вы хотите запустить, и укажите свою дату, после чего уведомление придет в этот конкретный день. Надеюсь, это вам поможет.

-(void) weekEndNotificationOnWeekday: (int)weekday :(UILocalNotification *)notification : (NSDate*) alramDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *componentsForFireDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate: alramDate];
    [componentsForFireDate setWeekday: weekday] ; //for fixing Sunday
  //   [componentsForFireDate setHour: 20] ; //for fixing 8PM hour
 //    [componentsForFireDate setMinute:0] ;
 //    [componentsForFireDate setSecond:0] ;
    notification.repeatInterval = NSWeekCalendarUnit;
    notification.fireDate=[calendar dateFromComponents:componentsForFireDate];
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

}
person Chandni - Systematix    schedule 11.03.2014

Я знаю, как установить уведомление на определенное время в будущем, но как установить уведомление, скажем, на 18:00 понедельника?

Вы можете создать объект NSDate, представляющий 18:00 следующего понедельника, используя подход, показанный в Как получить NSDate для определенного дня недели и времени из существующей NSDate. Затем, если вы хотите, чтобы это повторялось каждый понедельник, вы можете использовать localNotification.repeatInterval = NSWeekCalendarUnit. Однако я не уверен, что он будет работать должным образом с переходом на летнее время.

person Arek Holko    schedule 09.10.2013

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

person RyanR    schedule 09.10.2013
comment
На самом деле это был не вопрос - он больше спрашивал, как создать уведомление о точной дате - и тут приходит fireDate. - person Grzegorz Krukowski; 09.10.2013