Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在特定时间触发的计划通知-Swift_Ios_Swift_Uilocalnotification - Fatal编程技术网

Ios 在特定时间触发的计划通知-Swift

Ios 在特定时间触发的计划通知-Swift,ios,swift,uilocalnotification,Ios,Swift,Uilocalnotification,在我的应用程序中,我有一个uidatepickerview,可以让用户选择时间。目前在我的代码中,我选择了作为dateA传递的时间。然后,我在一个单独的uitableview中循环选择所有的日期,并检查它们是否等于今天(如星期二)。如果日期相同,则我将在所选时间发送通知,该时间作为dateA传递。但是,当我尝试发送通知时,它不会被发送 以下是我的代码片段,显示了我的尝试: var dateA: Date? = nil//where selected time is kept v

在我的应用程序中,我有一个uidatepickerview,可以让用户选择时间。目前在我的代码中,我选择了作为
dateA
传递的时间。然后,我在一个单独的uitableview中循环选择所有的日期,并检查它们是否等于今天(如星期二)。如果日期相同,则我将在所选时间发送通知,该时间作为
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.")
            }
        }

尝试在此处添加所有组件:

        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()
}
此外,我会检查您选择的日期是否因为您的设备的时区不同而混乱


希望这对您有所帮助

假设您看到了“今天是正确的一天”消息,一个候选问题是对您的
未通知请求使用固定标识符
。如前所述,“若标识符不唯一,则不会传递通知”

另外,如果
requestAuthorization
调用失败,我建议添加一条错误消息。现在,如果权限因任何原因失败,您将无法知道,并且不会发送任何通知


不相关,
cellForRowAt
不是创建通知的正确位置。如果用户没有将特定单元格滚动到视图中,则不会创建任何通知。如果用户将单元格从视图中滚动出来,然后再返回视图,您将再次尝试创建相同的通知请求。总之,单元格是否出现(以及稍后是否再次出现)与是否应创建通知无关


通知的创建属于您更新模型的地方(或响应某些用户操作,如选中复选框等)。

它不起作用。我相信,当我检查是否选择了所有日期,并将其存储在名为daily(其值为false)的变量中,并说如果daily==true,则会发送通知,因此,可能会出现另一个问题。@RajatKhare我建议尝试在您的视图中安排一个测试通知,从现在起延迟10秒加载,看看它是否启动。@Rob感谢您的评论。几个小时前我已经解决了这个问题,我很快就会写我的解决方案。基本上,我没有阻止发送通知的唯一标识符,这就是你所说的。