2016-08-12 7 views
13

Sprawdziłem aplikację iOS 10 Home. Zrzut ekranu jest przechwytywany tylko z aplikacji domowej.Powtórz HMTimerTrigger Przez wiele dni (np. W każdy poniedziałek, środę .... jak w aplikacji iOS 10 Home)

enter image description here Od ostatnich 2 dni staram się implementować funkcję powtarzania HMTimerTrigger. Moim wymaganiem jest powtarzanie wyzwalacza w każdy poniedziałek, wtorek i piątek. Co mogę znaleźć, to mogę dodać tylko jeden dzień (poniedziałek lub wtorek ... ale nie poniedziałek i wtorek) jak poniżej.

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]]; 

Dziękuję za przeczytanie mojego posta. Wszelkie pomysły/sugestie byłyby bardzo pomocne.

+0

Chociaż nie można skonfigurować wielu dni w jednym wystąpieniu 'HMTimerTrigger'. Możesz użyć wielu HMTimerTrigger opartych na wyzwalaniu w różnych dniach. W tym celu 'HMHome' ma metodę addTrigger, która pozwala dodawać wiele wyzwalaczy. W twoim przypadku powinieneś stworzyć 'HMTimerTrigger' dla każdego dnia osobno i dodać je do instancji' HMHome'. W twoim przykładzie musisz dodać trzy wyzwalacze - jeden dla poniedziałku, jeden dla wtorku i jeden dla piątku. – Ravin

+0

Witam @Ravin masz rację, ale problem polega na tym, że pokazujemy wszystkie wyzwalacze. W takim przypadku użytkownik może się pomylić. Dlatego właśnie szukam metody ramowej HomeKit. – SRI

+0

Chociaż nie jest to udokumentowane w ich publicznym interfejsie API, można sprawdzić za pomocą wsparcia technicznego (Incydent pomocy technicznej) i potwierdzić, czy jest jakiś oficjalny sposób na to. Dwie TSI są dostępne dla jednego konta programisty. (Https://developer.apple.com/support/technical/) --- Jeśli oficjalnie nie jest obsługiwane, możesz napisać własny kod, aby mieć coś takiego jak TriggerGroup i zarządzać nim za pomocą nazwa, którą przekazujesz podczas tworzenia wyzwalacza. Może to pomóc w zapewnieniu przejrzystego interfejsu użytkownika. – Ravin

Odpowiedz

4

Ta funkcja nie jest dostępna publicznie, nawet jeśli Apple ma ją w swojej aplikacji HomeKit. Najlepsze, co możesz zrobić, to stworzyć wiele wyzwalaczy na każdy dzień, ale wtedy użytkownik będzie zdezorientowany.

Proszę otworzyć błąd radaru na nim here

-1

Kilka lat temu zrobiłem to samo za pomocą powiadomienia. Nie można utworzyć wielu wyzwalaczy dla jednej instancji. Musisz więc stworzyć go na każdy dzień. Mam nadzieję, że ten przykład może dać ci jakiś pomysł.

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] ; 
} 
+0

Jest to związane z HomeKitem, ale dałeś odpowiedź na powiadomienia. Obie koncepcje są różne – SRI

Powiązane problemy