2016-06-14 10 views
8

W UILocalNotification używamy NSCalendarUnitMinute podobnie jak powtarzanie ..... ale nie mogę znaleźć w iOS 10 UserNotification doc ... Jak mogę użyć NSCalendarUnitMinute jak powtórzyć w iOS 10 UserNotification?Jak mogę ustawić NSCalendarUnitMinute repeatInterval na iOS 10 UserNotifications?

Oto kod, który zaplanuje lokalnym powiadomienia o 8:30 pm i będzie powtarzać po każdej jednej minuty.

UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
localNotification.fireDate = pickerDate; 
localNotification.alertBody = self.textField.text; 
localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
localNotification.repeatInterval = NSCalendarUnitMinute; 
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

Odpowiedz

1

Użyj UNCalendarNotificationTrigger z DateComponents zamiast NSCalendar:

var date = DateComponents() 
date.hour = 8 
date.minute = 30 

let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true) 
let content = UNNotificationContent() 
// edit your content 

let notification = UNNotificationRequest(identifier: "myNotification", content: content, trigger: trigger) 

ustawić datę z instancji DateComponents i określić, czy zgłoszenie należy powtórzyć z parametru UNCalendarNotificationTrigger inicjatora repeats.

UNCalendarNotificationTrigger Documentation

Zaledwie główek, że nie jest literówka w Apple Docs (od 6/13). Jeśli używasz NSDateComponents zamiast DateComponents, trzeba będzie jednoznacznie oddać swój date as DateComponents w parametrze dateMatching.

W odpowiedzi na Twój komentarz, nie wierzę, że pożądane zachowanie (zmiana częstotliwości powtarzanego powiadomienia) jest obsługiwane przez UNCalendarNotificationTrigger.

+0

Chcę opublikować UserNotification jutro o 20:30, który będzie powtarzać co minutę, jak to zrobić w UserNotification. –

+0

@ S.J Nie widzę żadnych metod w interfejsie API, aby zmienić częstotliwość powiadomienia, o które prosisz. Widzę tylko opcje powtarzania raz dziennie. Czy było to możliwe z "UILocalNotification"? Co można zrobić, to w programie obsługi dla pierwszego powiadomienia ustawić nowe powiadomienie na minutę po uruchomieniu bieżącego. Będę szukał sposobu na osiągnięcie pożądanego zachowania. – JAL

+0

Czy czytasz [dokumenty dotyczące UserNotifications] (https://developer.apple.com/reference/usernotifications)? – JAL

0

pokrywa się ze mną to mój pierwszy post.

Potrzebowaliśmy 1 minutowy odstęp czasu powtarzania dla naszej aplikacji w iOS 10 i wykorzystywane jako obejście kombinacja starych i nowych ram.

  1. planowania powtarzającej lokalnych informację ze starym:

    UILocalNotification * ln = [[UILocalNotification alloc] inicjującego];
    ...
    ln.repeatInterval = kCFCalendarUnitMinute;
    ln.userInfo = @ {@ "alarmID": ...}
    ...
    [[UIApplication sharedApplication] scheduleLocalNotification: ln];

Spowoduje to utworzenie i zaplanowanie zwykłe powtarzające LNS że pojawi się jako UNNotification z UNLegacyNotificationTrigger

użyłem alarmID połączyć stare i nowe ramy.

Spróbuj:

UNUserNotificationCenter* center = [UNUserNotificationCenter 

currentNotificationCenter]; 
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) { 
    NSLog(@"----------------- PendingNotificationRequests %i -------------- ", (int)requests.count); 
    for (UNNotificationRequest *req in requests) { 
     UNNotificationTrigger *trigger = req.trigger; 
     NSLog(@"trigger %@", trigger); 
    } 
}]; 
  1. reagowania na działania i powiadomień pożarowych-ing, manipulując centrum powiadomień:

Z nowymi metodami ramy UNUserNotificationCenter: willPresentNotification: didReceiveNotificationResponse:

  1. Zażądaj autoryzacji i rejestracji kategorii zrobiłem dla obu frameworków w zwykły sposób.

Nadzieja to pomaga

2

Chociaż wydaje się, że stary powiadomienia ramy miał lepsze wsparcie dotyczące tego, to tylko do czasu, zdajemy sobie sprawę, że nowe jest lepsze !!

Miałem podobne problemy, a poniżej próbka tego, jak stare powiadomienia mogą iść w parze z nowymi.

Aby być po bezpieczniejszej stronie, jest to Swift2.3.

// Retrieve interval to be used for repeating the notification 
    private func retrieveRepeatInterval(repeatTemp: RepeatInterval) { 
     switch repeatTemp { 
     case .Never: 
      if #available(iOS 10.0, *) { 
       toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month, .Year], fromDate: timeTemp!) 
       toDateComponents.second = 0 
       repeatNotification = false 
      } else { 
       repeatIntervalTemp = nil 
      } 
     case .EveryMinute: 
      if #available(iOS 10.0, *) { 
       toDateComponents.second = 0 
       repeatNotification = true 
      } else { 
       repeatIntervalTemp = .Minute 
      } 
     case .EveryHour: 
      if #available(iOS 10.0, *) { 
       toDateComponents = NSCalendar.currentCalendar().components([.Minute], fromDate: timeTemp!) 
       toDateComponents.second = 0 
       repeatNotification = true 
      } else { 
       repeatIntervalTemp = .Hour 
      } 
     case .EveryDay: 
      if #available(iOS 10.0, *) { 
       toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute], fromDate: timeTemp!) 
       toDateComponents.second = 0 
       repeatNotification = true 
      } else { 
       repeatIntervalTemp = .Day 
      } 
     case .EveryWeek: 
      if #available(iOS 10.0, *) { 
       toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Weekday], fromDate: timeTemp!) 
       toDateComponents.second = 0 
       repeatNotification = true 
      } else { 
       repeatIntervalTemp = .WeekOfYear 
      } 
     case .EveryMonth: 
      if #available(iOS 10.0, *) { 
       toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day], fromDate: timeTemp!) 
       toDateComponents.second = 0 
       repeatNotification = true 
      } else { 
       repeatIntervalTemp = .Month 
      } 
     case .EveryYear: 
      if #available(iOS 10.0, *) { 
       toDateComponents = NSCalendar.currentCalendar().components([.Hour, .Minute, .Day, .Month], fromDate: timeTemp!) 
       toDateComponents.second = 0 
       repeatNotification = true 
      } else { 
       repeatIntervalTemp = .Year 
      } 
     } 
    } 

Chociaż nie jest to wyczerpujące, w zasadzie obejmowałem wszystko od minuty do roku.

I być bardziej szczegółowe,

// RepeatInterval 
enum RepeatInterval : String, CustomStringConvertible { 
    case Never = "Never" 
    case EveryMinute = "Every Minute" 
    case EveryHour = "Every Hour" 
    case EveryDay = "Every Day" 
    case EveryWeek = "Every Week" 
    case EveryMonth = "Every Month" 
    case EveryYear = "Every Year" 

    var description : String { return rawValue } 

    static let allValues = [Never, EveryMinute, EveryHour, EveryDay, EveryWeek, EveryMonth, EveryYear] 
} 

var repeatTemp: RepeatInterval? 

var repeatIntervalTemp: NSCalendarUnit? 

var timeTemp: NSDate? 

var toDateComponents = NSDateComponents() 

Jak to działa dla mnie, powinna ona prawdopodobnie do końca sobą. Spróbuj i daj mi znać, jeśli wystąpi problem.

I, dla dokładnego rozwiązania tego pytania, doradziłbym poniżej.

(Prawdopodobnie Apple nie myśleć o takim scenariuszu, ale to może być obsługiwane)

  1. Harmonogram powiadomienie o 8:30 PM
  2. Kiedy powiadomienie jest wyzwalane, należy go usunąć i harmonogram kolejne powiadomienie z innym identyfikatorem, dla równoważnika NSCalendarUnitMinute pokazanego powyżej.
  3. Voila, to działa !! (Czy też nie?)
+0

Skąd wiadomo, że powiadomienie zostało wywołane, aby zaplanować następne? Widziałem sugestie korzystania z rozszerzenia usługi powiadomień, ale działają one tylko w przypadku powiadomień zdalnych :( – CMash

+0

@CMash. Masz rację. Przepraszamy za złe informacje, pod warunkiem, że bawiłem się z tym i wydaje mi się, że to się stało Wygląda jednak na to, że nie byłem w stanie. :(Nadal, powiedziałbym, że 'NSDateComponents', jest całkiem jasne? Jeśli ktoś potrzebuje go użyć. – Shyam

Powiązane problemy