Повторите 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] ;
}
Другие вопросы по тегам