Локальные уведомления не добавляются - PullRequest
0 голосов
/ 08 января 2019

У меня есть код, который работал до недавнего времени. Предполагается запланировать количество локальных уведомлений на основе списка указанных дат.

Код выглядит так:

static func scheduleNotifications()
{
    // Here, a list of dates when notifications should appear is
    // created. This is called pendingNotifications. It contains
    // a list of dates and the number of events on that date
    ...

    // Now I want to schedule up to 20 local notifications for
    // each of the dates. The badge should show the number of events
    let sortedDates = pendingNotifications.keys.sorted()
    for i in 0 ..< min(20, sortedDates.count)
    {
        let notificationDate = ...

        let content = UNMutableNotificationContent()
        content.title = "The title"
        content.body = "The description"
        content.sound = UNNotificationSound.default()
        content.badge = NSNumber(value: pendingNotifications[sortedDates[i]]!)

        let ident = UUID().uuidString
        let trigger = UNCalendarNotificationTrigger(dateMatching: calendar.dateComponents(in: calendar.timeZone, from: notificationDate), repeats: false)
        let request = UNNotificationRequest(identifier: ident, content: content, trigger: trigger)

        let center = UNUserNotificationCenter.current()
        center.add(request) { error in
            center.getPendingNotificationRequests() { requests in
                print(requests.count)
            }
        }
    }
}

Этот код выполняется без ошибок, но счетчик запросов, который я печатаю в обработчике завершения, всегда выдает 0, и я не получаю никаких уведомлений.

Тогда у меня есть вторая функция, которая просто планирует пример уведомления независимо от любых других критериев:

static func scheduleSampleNotification()
{
    let content = UNMutableNotificationContent()
    content.title = "Test"
    content.body = "Sample Notification!"
    content.sound = UNNotificationSound.default()
    content.badge = 5

    let ident = UUID().uuidString
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: false)
    let request = UNNotificationRequest(identifier: ident, content: content, trigger: trigger)
    let center = UNUserNotificationCenter.current()
    center.add(request)
}

Если я добавлю строку к scheduleNotifications, которая вызывает scheduleSampleNotification прямо перед комментарием, который я написал о списке создаваемых дат, количество ожидающих запросов всегда будет равно 1, и примерное уведомление также появится через минуту.

Я на самом деле не знаю, что я делаю здесь неправильно, и я немного растерялся, тем более, что тот же код работал нормально, прежде чем я изменил минимальную требуемую версию iOS с 9 на 10.3 (в предыдущей версии я проверял работал ли я на iOS 9 и использовал старый способ предоставления локальных уведомлений - теперь я удалил этот код, начиная с 10.3. Я понимаю, что вы должны использовать UNUserNotificationCenter).

Я тестирую в симуляторе и на устройстве iOS 12. Я использую XCode 10.1.


EDIT
Интересно: когда я изменяю с UNCalendarNotificationTrigger на UNTimeIntervalNotificationTrigger, все уведомления планируются. Может быть, что-то не так с моим курком - но все даты в будущем?


РЕДАКТИРОВАТЬ 2
ОК, я нашел проблему. Очевидно, что следующее больше не работает:

let dateComponents = calendar.dateComponents(in: calendar.timeZone, from: notificationDate)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

пока работает следующее:

let dateComponents = calendar.dateComponents([.day, .month, .year, .hour, .minute], from: notificationDate)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

Понятия не имею почему, тем более, что раньше работало ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...