Повторите HMTimerTrigger на несколько дней (например, каждый понедельник, среда.... как в приложении iOS 10 Home)
Я проверил приложение iOS 10 Home. Снимок экрана получен только из приложения Home.
С последних 2 дней я пытался реализовать функцию повтора HMTimerTrigger. Мое требование - я должен повторять триггер каждый понедельник, вторник и пятницу. Я обнаружил, что могу добавить только один день (понедельник или вторник... но не понедельник и вторник), как показано ниже.
unsigned flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitWeekOfYear | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute;
NSDate *fireDate = [NSDate date];
NSDateComponents *recurrenceComponents = [[NSDateComponents alloc] init];
recurrenceComponents.weekday = 2; // For monday
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:flags fromDate:fireDate];
fireDate = [[NSCalendar currentCalendar] dateFromComponents:dateComponents];
HMTimerTrigger *trigger = [[HMTimerTrigger alloc] initWithName:triggerName.text
fireDate:fireDate
timeZone:nil
recurrence:recurrenceComponents
recurrenceCalendar:[NSCalendar currentCalendar]];
Спасибо за чтение моего поста. Любые идеи / предложения будут очень полезны.
2 ответа
Эта функция недоступна для широкой публики, даже если у Apple она есть в приложении HomeKit. Лучшее, что вы можете сделать, это создать несколько триггеров для каждого дня, но тогда пользователь будет сбит с толку.
Пожалуйста, откройте ошибку радара здесь
Несколько лет назад я сделал то же самое, используя уведомление. Вы не можете создать несколько триггеров с одним экземпляром. Таким образом, вы должны создать его на каждый день. Я надеюсь, что этот пример может дать вам некоторое представление.
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar] ;
NSDateComponents *componentsForReferenceDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate:[NSDate date]];
NSDate *referenceDate = [calendar dateFromComponents:componentsForReferenceDate] ;
NSDateComponents *componentsForFireDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate: referenceDate];
NSArray *arrayDays = [NSArray arrayWithObjects:@"1",@"3",@"5", nil];
for (int i=0; i<[arrayDays count]; i++)
{
// set components for time 2:00 p.m.
[componentsForFireDate setWeekday:[[arrayDays objectAtIndex:i] intValue]];
[componentsForFireDate setHour: 14];
[componentsForFireDate setMinute:0];
[componentsForFireDate setSecond:0];
NSDate *firstDateOfNotification = [calendar dateFromComponents: componentsForFireDate];
UILocalNotification *notification1 = [[UILocalNotification alloc] init] ;
notification1.fireDate = firstDateOfNotification;
notification1.timeZone = [NSTimeZone localTimeZone] ;
notification1.alertBody = [NSString stringWithFormat: @"Complete your daily survey"] ;
notification1.alertAction = @"go back";
notification1.repeatInterval= NSWeekCalendarUnit;
notification1.soundName = UILocalNotificationDefaultSoundName;
[[UIApplication sharedApplication] scheduleLocalNotification:notification1] ;
}