Создание UNNotification с негригорианским календарем

Я создаю свое приложение для запуска ежедневных, еженедельных и ежемесячных уведомлений в IOS swift 4. Уведомления отлично работают с использованием григорианского календаря. Однако, когда я меняю дату на календарь хиджры (Calendar (идентификатор: .islamicUmmAlQura), он не работает. Похоже, что UNCalendarNotificationTrigger преобразует любую дату в григорианский календарь. Ниже код ежемесячного уведомления отлично работает при использовании григорианского календаря:

func myNotification(at date: Date, withTitle title:String, andBody body:String, notificationIdentifier:String) {

let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents([.day,.hour, .minute], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.sound = UNNotificationSound.init(named: "notificationSound.wav")
let request = UNNotificationRequest(identifier: notificationIdentifier, content: content, trigger: trigger)
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [notificationIdentifier])
UNUserNotificationCenter.current().add(request) {(error) in
    if let error = error {
        print(" error: \(error)")
    }
}

}

Приведенный ниже код не работает, когда я конвертирую дату в исламскую дату, используя (Calendar(identifier: .islamicUmmAlQura) :

func myNotification(at date: Date, withTitle title:String, andBody body:String, notificationIdentifier:String) {

let calendar = Calendar(identifier: .islamicUmmAlQura)
let components = calendar.dateComponents([.day,.hour, .minute], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.sound = UNNotificationSound.init(named: "notificationSound.wav")
let request = UNNotificationRequest(identifier: notificationIdentifier, content: content, trigger: trigger)
UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [notificationIdentifier])
UNUserNotificationCenter.current().add(request) {(error) in
    if let error = error {
        print(" error: \(error)")
    }
}

person AOT    schedule 23.12.2017    source источник


Ответы (3)


Это сработало после добавления типа календаря в триггер

trigger = UNCalendarNotificationTrigger(calendar:calendar, dateMatching: components, repeats: true)
person AOT    schedule 26.12.2017

Если платформа UserNotifications ожидает, что DateComponents интерпретируется в определенном календаре, то этот календарь вы должны использовать. Это не означает, что базовая дата и время изменится или будет неверной.

Date — это просто точка на временной шкале. То, как временная шкала разделена и названа, зависит от календаря, но самому Date все равно. Точка на временной шкале остается неизменной независимо от выбранного вами описания или декомпозиции.

См. Преобразование NSDates из одного календаря в другой

person jscs    schedule 23.12.2017
comment
Спасибо. Раньше он отлично работал с Objective-C, это может быть ошибка с X-Code 9. - person AOT; 25.12.2017

Добавьте .calendar к компонентам, это заставит UNCalendarNotificationTrigger рассчитывать дату с помощью вашего календаря.

let date = Date()
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents([.calendar, .day, .hour, .minute], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
person yue Max    schedule 27.11.2020