Swift UI 2.0: 如何设置这个通知?

Swift UI 2.0: How can to set up this Notification?

首先,我从未在应用程序中使用过通知。我已经完成了教程,但整件事让我很困惑。

我创建了一个名为 Notify.swift 的 SwiftUI 文件。我希望用户能够设置通知时间,提醒他们在指定时间执行任务,如下图所示:

在图像中看到时间的地方,我创建了一个 DatePicker 来选择通知时间:

VStack {
    Button(action: {}) {
        HStack {
             DatePicker("   Select a time ....", 
                 selection: $wakeup, displayedComponents: .hourAndMinute)
                 .font(.title2)
                 .accentColor(Color(.white))
        }
    }.background(Color(.black))
}
.frame(width: .infinity, height: 40, alignment: .center)
.padding()

当用户点击创建按钮设置通知时,它应该在那个特定的时间设置通知(所有时间,除非改变)。这是我需要发生但不知道该怎么做的事情:

如果为 8:30am 设置了通知时间,如图所示,并且用户选择了创建,则会设置一个通知,并应发送给用户执行任何任务,可能带有声音和在指定时间发消息。

我知道有不同类型的通知:本地、用户、Apple 推送等,但我不知道这属于哪种类型或如何操作。

这是通知还是警报?

您可以为此使用本地通知。这里我做了一个函数让你触发通知。首先,检查该时间是否早于当前时间。然后通知将在明天,我们将在日期中增加一天。您可以根据需要更改标题,body。

确保将 DatePicker 包裹在按钮外,否则当您单击 DatePicker 时它总是会触发通知。

func scheduleNotification() -> Void {
    let content = UNMutableNotificationContent()
    content.title = "Your title"
    content.body = "Your body"
    
    var reminderDate = wakeup
    
    if reminderDate < Date() {
        if let addedValue = Calendar.current.date(byAdding: .day, value: 1, to: reminderDate) {
            reminderDate = addedValue
        }
    }

    let comps = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: reminderDate)
                           
    let trigger = UNCalendarNotificationTrigger(dateMatching: comps, repeats: false)
    
    let request = UNNotificationRequest(identifier: "alertNotificationUnique", content: content, trigger: trigger)

     UNUserNotificationCenter.current().add(request) {(error) in
         if let error = error {
             print("Uh oh! We had an error: \(error)")
         }
     }
}

您还需要像这样申请通知权限:

func requestPush() -> Void {
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, error in
        if success {
            print("All set!")
        } else if let error = error {
            print(error.localizedDescription)
        }
    }
}

这是你的按钮:

VStack {
    Button(action: {
        scheduleNotification()
    }) {
        Text("Save notification")
    }
     DatePicker("Select a time ....",
         selection: $wakeup, displayedComponents: .hourAndMinute)
         .font(.title2)
         .accentColor(Color(.white))
}