Срабатывает только последнее добавленное уведомление

Я обновляю уведомление в структуре UNUserNotification для своего похожего на будильник приложения, и я думал, что мне это удалось, но я понял, что когда я устанавливаю более одного будильника, я получаю уведомление только о последнем. Повторяющиеся дни обрабатываем тесто. Может быть проблема в идентификаторе триггера, который получает ту же строку, что и предыдущие, и перезаписывает ее? Я действительно не понимаю этого поведения и не могу найти, в чем проблема.

Это код:

func setRouteNotification(_ date: Date, onWeekdaysForNotify weekdays:[Int], snoozeEnabled:Bool,  onSnooze: Bool, soundName: String, routeName: String, index: Int) {
    configureCategory()
    // Notification content
    let routeCheckNotificationContent = UNMutableNotificationContent()
    let datesForNotification = correctDate(date, onWeekdaysForNotify: weekdays)
    routeCheckNotificationContent.title = "Hello!! Are you ready to cycle?"
    routeCheckNotificationContent.body = "Check route for alerts?"
    routeCheckNotificationContent.categoryIdentifier = Id.notificationCategory
    routeCheckNotificationContent.sound = UNNotificationSound.init(named: soundName + ".mp3")

    let repeating: Bool = !weekdays.isEmpty
    routeCheckNotificationContent.userInfo = ["snooze" : snoozeEnabled, "index": index, "soundName": soundName, "routeName": routeName, "repeating" : repeating]
    //repeat weekly if repeat weekdays are selected
    //no repeat with snooze notification
    if !weekdays.isEmpty && !onSnooze{ }

    syncAlarmModel()
    var counter = 1

    for d in datesForNotification {
        if onSnooze {
            alarmModel.alarms[index].date = Scheduler.correctSecondComponent(date: alarmModel.alarms[index].date)
        } else {
            alarmModel.alarms[index].date = d
        }

        // Notification trigger
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents(in: .current, from: d)
        let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute, second: components.second)
        let trigger = UNCalendarNotificationTrigger(dateMatching: newComponents, repeats: true)

        // Notification Request
        let routeNotificationRequest = UNNotificationRequest(identifier: "routeNotificationRequest\(scheduledNotifications.count + counter)", content: routeCheckNotificationContent, trigger: trigger)

        // Add request
        UNUserNotificationCenter.current().add(routeNotificationRequest) { (Error) in
            if Error != nil {
                print("something went wrong with adding notification")
            }
        }
        print("added request\(alarmModel.alarms.count + weekdays.count + counter)")
        scheduledNotifications.append(counter)
        print("scheduled notifications are \(scheduledNotifications.count)")
        counter = ( counter + 1 )
    }
    print(alarmModel.alarms)
}

Есть идеи, почему не устанавливаются все запрограммированные уведомления? Как обычно, большое спасибо.

РЕДАКТИРОВАТЬ:

Я попытался настроить массив var scheduledNotifications: [Int] = [], в котором хранится прогрессивное число по мере добавления уведомлений, и использовать его в качестве идентификатора для запроса.

let routeNotificationRequest = UNNotificationRequest(identifier: "routeNotificationRequest\(scheduledNotifications.count + counter)", content: routeCheckNotificationContent, trigger: trigger)

поэтому я уверен, что все добавленные уведомления имеют уникальный идентификатор запроса, но ничего не изменилось, по-прежнему получает уведомление только последнее.

РЕДАКТИРОВАТЬ 2: вывод консоли, когда я устанавливаю 2 уведомления на каждый день:

added request9B642AB7-D4F3-4BDA-A5B3-D259419390D5
scheduled notifications are 1
added requestBA0EF286-CD4D-408D-AEFC-E3DED24FBBB4
scheduled notifications are 2
added request947FEFEF-0B4E-4163-8435-DCEC725F21F7
scheduled notifications are 3
added request8FF19184-F970-45AD-95FE-39CFABF83348
scheduled notifications are 4
added requestA447CABF-AD80-4A73-B214-B8A1AA47F76B
scheduled notifications are 5
added request217EF2E4-6241-4840-9431-16744F2E5314
scheduled notifications are 6
added request28C92EF2-143C-4364-9CC3-EB5335AA9B6F
scheduled notifications are 7
[fix_it_mapView.Alarm(date: 2018-10-06 13:28:00 +0000, enabled: true, snoozeEnabled: false, repeatWeekdays: [1, 2, 3, 4, 5, 6, 7], uuid: "1C5A746F-F97D-4149-A0CC-47E6334BF3C3", mediaID: "", mediaLabel: "Burlone", label: "Route", onSnooze: false, routeLabel: "prova3"), fix_it_mapView.Alarm(date: 2018-09-23 13:29:00 +0000, enabled: true, snoozeEnabled: false, repeatWeekdays: [1, 2, 3, 4, 5, 6, 7], uuid: "B708BC27-82AA-4AA2-A8CA-252460E48476", mediaID: "", mediaLabel: "Burlone", label: "Route", onSnooze: false, routeLabel: "prova1")]
dates for notification are: [2018-09-30 13:28:00 +0000, 2018-10-01 13:28:00 +0000, 2018-10-02 13:28:00 +0000, 2018-10-03 13:28:00 +0000, 2018-10-04 13:28:00 +0000, 2018-10-05 13:28:00 +0000, 2018-10-06 13:28:00 +0000]
added request2467230C-BC4A-4307-A0FA-108C5C291DCC
scheduled notifications are 8
added requestF27D9E76-BCCC-4E3A-91D7-CA60E64B61B9
scheduled notifications are 9
added requestDFF37582-AB57-4029-A480-6FFA4068E316
scheduled notifications are 10
added requestBC5633BD-234C-4555-8259-988908B6E4DA
scheduled notifications are 11
added requestEC35384F-2E7F-4267-A745-777E0C2A2CE8
scheduled notifications are 12
added requestFF866674-ED94-4BA0-8BA5-E8314521EA4F
scheduled notifications are 13
added request4D739860-83CB-43F9-895D-2E8D48C5154E
scheduled notifications are 14
[fix_it_mapView.Alarm(date: 2018-10-06 13:28:00 +0000, enabled: true, snoozeEnabled: false, repeatWeekdays: [1, 2, 3, 4, 5, 6, 7], uuid: "1C5A746F-F97D-4149-A0CC-47E6334BF3C3", mediaID: "", mediaLabel: "Burlone", label: "Route", onSnooze: false, routeLabel: "prova3"), fix_it_mapView.Alarm(date: 2018-10-06 13:29:00 +0000, enabled: true, snoozeEnabled: false, repeatWeekdays: [1, 2, 3, 4, 5, 6, 7], uuid: "B708BC27-82AA-4AA2-A8CA-252460E48476", mediaID: "", mediaLabel: "Burlone", label: "Route", onSnooze: false, routeLabel: "prova1")]
dates for notification are: [2018-09-23 13:29:00 +0000, 2018-10-01 13:29:00 +0000, 2018-10-02 13:29:00 +0000, 2018-10-03 13:29:00 +0000, 2018-10-04 13:29:00 +0000, 2018-10-05 13:29:00 +0000, 2018-10-06 13:29:00 +0000]
2018-09-23 15:27:12.771112+0200 fix-it mapView[14162:297740] TIC Read Status [2:0x0]: 1:57
2018-09-23 15:27:12.771425+0200 fix-it mapView[14162:297740] TIC Read Status [2:0x0]: 1:57

person Vincenzo    schedule 23.09.2018    source источник
comment
Пожалуйста, не добавляйте код, сообщения об ошибках и т. Д. В виде изображений - они не доступны для поиска и не могут быть скопированы при написании ответа. Кроме того, отредактируйте свой вопрос и удалите закомментированный код.   -  person Ashley Mills    schedule 23.09.2018
comment
@ Эшли Миллс. Извините за опечатки и за изображение. Я отредактировал вопрос, как было предложено. Спасибо, что указали на это.   -  person Vincenzo    schedule 23.09.2018
comment
Вы удаляете приложение каждый раз, когда запускаете его, чтобы запланировать уведомления? в противном случае новые уведомления будут иметь те же идентификаторы, что и при предыдущем запуске. лучше сгенерировать уникальный идентификатор, чем использовать счетчик.   -  person hasan    schedule 23.09.2018
comment
@hasan. нет, я не удаляю приложение, хотя при использовании того же идентификатора новые уведомления будут заменять старые прогоны новыми настройками. Что бы вы подобрали для уникального идентификатора, отличного от счетчика, который я использую?   -  person Vincenzo    schedule 23.09.2018
comment
Было бы это то, что вы думаете? let uuid = UUID().uuidString   -  person Vincenzo    schedule 23.09.2018
comment
@vincenzo Я не уверен. но это более безопасный подход. попробуйте плз.   -  person hasan    schedule 23.09.2018
comment
Откуда вы берете datesForNotification и насколько велик этот массив? Какой порядок дат?   -  person Yury Imashev    schedule 23.09.2018
comment
@ Юрий Имашев. datesForNotification это массив Date, который заполняется как результат возврата из метода correctiveDate, который вызывается внутри setRouteNotificationmethod let datesForNotification = correctDate(date, onWeekdaysForNotify: weekdays). дни недели - это массив Int, который заполняется из дней недели для повторения выбора tableview   -  person Vincenzo    schedule 23.09.2018
comment
Итак, если я правильно понял, у вас одно уведомление в будний день? Как вы проверяете, что срабатывает только последнее уведомление?   -  person Yury Imashev    schedule 23.09.2018
comment
Ставил 2 уведомления за семь дней 1 минуту друг от друга и срабатывает только второе. запустив его на айфоне, он срабатывает каждый день   -  person Vincenzo    schedule 23.09.2018


Ответы (3)


Я использовал текущую дату в секундах в качестве идентификатора, и он отлично работал со мной следующим образом:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    UNUserNotificationCenter.current().requestAuthorization(options: []) { (granted, error) in


        if granted {

            let routeCheckNotificationContent = UNMutableNotificationContent()
            routeCheckNotificationContent.title = "Hello!! Are you ready to cycle?"
            routeCheckNotificationContent.body = "Check route for alerts?"
            routeCheckNotificationContent.categoryIdentifier = "\(Date().timeIntervalSince1970)"
            routeCheckNotificationContent.sound = UNNotificationSound.default()

            routeCheckNotificationContent.userInfo = ["snooze" : false, "index": 1, "soundName": "1", "routeName": "hmm", "repeating" : true]


            self.addNotification(content: routeCheckNotificationContent, date: Date().addingTimeInterval(30))
            self.addNotification(content: routeCheckNotificationContent, date: Date().addingTimeInterval(60))

        } else {

            print("Notification permission dendied !!")
        }
    }
}

func addNotification(content: UNMutableNotificationContent, date: Date) {

    let calendar = Calendar(identifier: .gregorian)

    let components = calendar.dateComponents(in: .current, from: date)
    let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute, second: components.second)

    let trigger = UNCalendarNotificationTrigger(dateMatching: newComponents, repeats: true)
    // Notification Request
    let routeNotificationRequest = UNNotificationRequest(identifier: "\(date.timeIntervalSince1970)", content: content, trigger: trigger)


    // Add request
    UNUserNotificationCenter.current().add(routeNotificationRequest) { (Error) in
        if Error != nil {
            print("something went wrong with adding notification")
        }
    }
}

Может быть, что-то не так с вашими свиданиями!

person hasan    schedule 23.09.2018
comment
Изменен UUID, но результат тот же, запускается только второе запланированное уведомление. - person Vincenzo; 23.09.2018
comment
нет, я установил так: let uuid = UUID().uuidString let routeNotificationRequest = UNNotificationRequest(identifier: uuid, content: routeCheckNotificationContent, trigger: trigger) - person Vincenzo; 23.09.2018
comment
@hasan. routeCheckNotificationContent.identifier = UUID().uuidString выдает ошибку: Value of type 'UNMutableNotificationContent' has no member 'identifier'. Разве запрос не должен быть с разными идентификаторами? - person Vincenzo; 23.09.2018
comment
дайте мне несколько минут, я попробую это для вас - person hasan; 23.09.2018
comment
@vincenzo Я добавил пример, который у меня сработал. оба уведомления запускаются. - person hasan; 23.09.2018
comment
ну да, это связано с датами, но я не могу найти ошибку .. есть ли способ поделиться проектом? - person Vincenzo; 23.09.2018
comment
когда я устанавливаю 2 уведомления, я получаю вывод из консоли с указанием EDIT 2. - person Vincenzo; 23.09.2018
comment
мой проект вообще не содержит кода, кроме тех, которые вы видите. - person hasan; 23.09.2018
comment
Я хочу поделиться своим - person Vincenzo; 23.09.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person hasan; 23.09.2018

Попробовав разные вещи, я думаю, что решил это, но я не понимаю, почему это не работает так, как я делал. d - это значение даты, взятое из цикла for in в функции setRouteNotification, которая представляет день недели для уведомления, которое должно быть запланировано (см. Код в вопросе) Работа:

let components2 = Calendar.current.dateComponents([.weekday,.hour,.minute,.second,], from: d)
let trigger2 = UNCalendarNotificationTrigger(dateMatching: components2, repeats: true)

Не работает:

let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents(in: .current, from: d)
var newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute, second: components.second, weekday: components.weekday)
let trigger = UNCalendarNotificationTrigger(dateMatching: NewComponents, repeats: true)
person Vincenzo    schedule 23.09.2018
comment
Можете ли вы сделать свой ответ понятным и универсальным. Что здесь d? - person Honey; 23.09.2018
comment
@Медовый. Что ты имеешь в виду под родовым? Надеюсь, я отредактировал свой ответ так, как вы думаете. Дайте мне знать, если нет. Спасибо - person Vincenzo; 23.09.2018
comment
@hasan. Спасибо за указание на то, что с моим свиданием что-то не так, и за усилия, которые вы приложили, чтобы помочь мне. - person Vincenzo; 23.09.2018

У меня была такая же проблема, и я понял, что это происходит, потому что я использовал один и тот же идентификатор @ "ID" для нескольких уведомлений. Когда я сделал идентификаторы уникальными, все они сработали.

UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"ID" content:notification trigger:trigger];
person Mona    schedule 01.06.2020