在Swift中安排通知以在特定时间触发

4
在我的应用中,我有一个uidatepickerview,让用户选择时间。目前在我的代码中,我将选定的时间作为dateA传递。然后,我循环遍历所有已选择的日期(例如星期二)并检查它们是否等于今天的日期。如果这些日期相同,则在传递的选定时间dateA时发送通知。然而,当我尝试发送通知时,通知没有被发送。
以下是我尝试过的代码片段:
    var dateA: Date? = nil//where selected time is kept

    var weekdaysChecked = [String]()//where selected weekdays are kept

    var alarms = [Alarm]() {
        didSet {
            tableView.reloadData()
        }
    }


    override func viewDidLoad() {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound], completionHandler: { (didAllow, error) in
        })

    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "alarmCell", for: indexPath) as! DisplayAlarmCell

        let row = indexPath.row
        let alarm = alarms[row]
        let date = Date()
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat  = "EEEE"//"EE" to get short style
        let dayInWeek = dateFormatter.string(from: date)


        if(alarms.count == 40) {
            self.navigationItem.rightBarButtonItem?.isEnabled = false
            tableView.reloadData()
        }

        cell.alarmTitle.text = alarm.alarmLabel
        cell.clockTitle.text = alarm.time

        for weekdays in weekdaysChecked {
            if(dayInWeek == weekdays){
                let content = UNMutableNotificationContent()
                content.title = alarm.alarmLabel!
                content.subtitle = alarm.time!
                content.sound = UNNotificationSound(named: "Spaceship_Alarm.mp3")

                let trigger = Calendar.current.dateComponents([.hour,.minute], from: dateA!)
                let triggerNotif = UNCalendarNotificationTrigger(dateMatching: trigger, repeats: false)

                let triggerRequest = UNNotificationRequest(identifier: "AlarmNotif", content: content, trigger: triggerNotif)

                UNUserNotificationCenter.current().add(triggerRequest, withCompletionHandler: nil)

                print("This is the correct day.")
            }
        }

1
@Rob 谢谢你的评论。几个小时前我已经解决了这个问题,很快我会写出我的解决方案。基本上,我没有唯一标识符,这阻止了通知的发送,这正是你所说的。 - Rajat Khare
2个回答

1
假设您看到了“这是正确的日期”消息,一个可能的问题是在您的UNNotificationRequest中使用了固定标识符。正如文档所说,“如果标识符不唯一,则不会传递通知”。
此外,我建议如果requestAuthorization调用失败,请添加错误消息。目前,如果由于任何原因权限失败,您将不会知道,并且不会传递任何通知。

无关的是,cellForRowAt 不是创建通知的正确位置。如果用户没有将特定单元格滚动到视图中,就不会创建通知。如果用户将一个单元格滚动出视图,然后再次滚动回视图中,您将尝试再次创建相同的通知请求。归根结底,无论单元格是否出现(以及它是否稍后重新出现)与是否应创建通知无关。

创建通知应该在您更新模型的位置(或响应某些用户操作,例如选中复选框或类似操作)。


0

试着在这里添加所有的组件:

        let trigger = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from: dateA!)

并将这些方法添加到您的AppDelegate中

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) {
    completionHandler(UNNotificationPresentationOptionBadge)
}

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    completionHandler()
}

另外,我建议您检查一下您选择的日期是否因为设备所在的不同时区而出现混乱。

希望这能帮到您。


它没有起作用。我相信当我检查所有天数是否被选中并将其存储在一个名为daily的变量中(该变量保持false值),并且如果daily == true,则通知将被发送,因此可能存在不同的问题。 - Rajat Khare
@RajatKhare 我建议你尝试在你的视图didLoad中安排一个测试通知,延迟10秒钟,然后看看它是否触发。 - Nikita Gaidukov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接