gpt4 book ai didi

swift - 每 X 天本地通知 - Swift

转载 作者:行者123 更新时间:2023-11-28 09:39:47 25 4
gpt4 key购买 nike

在我开始之前请不要激怒我,因为我知道这个问题已经在这里被问了数百次,但没有可靠的答案,但我相信有一个使用后台刷新的解决方案。 https://medisafe.com/应用程序似乎已经解决了它!

目标:每x天在指定时间触发本地通知

我的解决方案

第 1 步:从开始日期和奇数事件(本例 2)天开始获取计时器间隔(已编辑)

第 2 步:通过重复设置此差异的间隔计时器

第 3 步:激活后台刷新(如果应用程序甚至终止,它会在后台加载应用程序并给我一个小窗口来执行一些任务)

第四步.设置后台刷新每天触发一次

第 5 步:执行获取项目 api,这将刷新所有计时器和通知

第 6 步坐下来,对我的解决方案惊讶地微笑

但这失败了。

所以一个定时器间隔

 let newTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 172800,repeats: true)

但这只会在每天执行后台提取时重置计时器,并且会从现在开始触发 2 天,而不是从开始日期开始。

因此必须有一种方法来比较日期的小时和分钟(开始日期、x 日期和当前日期以计算出计时器间隔值。

我目前正在使用日历组件。触发每天我做以下事情

      var triggerType : DateComponents? {
var triggerT : DateComponents?
var cal = Calendar(identifier: .gregorian)
cal.firstWeekday = 2
if let notificationModel = self.notificationModel {
switch notificationModel.reminderType {
case .daily?, .weekly?:
if let date = notificationModel.date {
triggerT = cal.dateComponents([.weekday, .hour, .minute], from:date)
if let weekday = notificationModel.weekday {
triggerT?.weekday = weekday
}
}
case .alternateDays?:
if let date = notificationModel.date {
triggerT = cal.dateComponents([ .hour, .minute], from:date)
// THIS IS WHERE I NEED HELP
}
case .monthly?:
if let date = notificationModel.date {
triggerT = cal.dateComponents([.day,.hour,.minute], from: date)
}
case .yearly?:
triggerT = Calendar.current.dateComponents([.month,.day,.hour,.minute], from: (notificationModel.date)!)
case .oneOff?:
triggerT = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute], from: (notificationModel.date)!)
case .none:
DispatchQueue.main.async {
if let category = self.notificationModel?.category, let title = self.notificationModel?.title {
Toast.down("An error was discovered in \(category). Please change the occurance value for the following \(title)")
}
}
}
} else {
print("NOTIFICATION MODEL IS CORRUPT")
}
return triggerT
}

func add(notification: NotificationModel){
let content = UNMutableNotificationContent()

if let title = notification.title,
let body = notification.body,
let identifier = notification.identifier {


content.title = title
content.body = body
content.sound = UNNotificationSound.default()
content.categoryIdentifier = (notification.category?.rawValue)!
content.setValue("YES", forKeyPath: "shouldAlwaysAlertWhileAppIsForeground")

var trigger : UNCalendarNotificationTrigger?

if let triggerType = self.triggerType {

if let occurance = notification.occurance {
if occurance > 0 {
}
}
trigger = UNCalendarNotificationTrigger(dateMatching: triggerType, repeats: true)

} else {
return
}

let interval = Date().timeIntervalSince1970
let identifierString = "2\(interval)"

var request : UNNotificationRequest!
if notification.reminderType == .alternateDays {
print("ADDING TIMER NOTIFICATION")
print("REMINDER TIME = \(notification.date)")
// 172800 = two days
let newTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 172800,
repeats: true)
request = UNNotificationRequest(identifier: identifierString,
content: content, trigger: newTrigger)
} else {
request = UNNotificationRequest(identifier: identifierString,
content: content, trigger: trigger)
}


center.add(request, withCompletionHandler: { (error) in
if let error = error {
// Something went wrong
print(error.localizedDescription)
} else
{
print("ADDING NOTIDCIATION \(content.title)")

}
})



//SNOOZE OR DELETE NOTIFICATIONS
let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: [])
let deleteAction = UNNotificationAction(identifier: "UYLDeleteAction",title: "Delete", options: [.destructive])
//Create a category with the actions: This requires another unique identifier (you probably want to define these magic strings in an enum):
let category = UNNotificationCategory(identifier: notification.category!.rawValue,
actions: [snoozeAction,deleteAction],
intentIdentifiers: [], options: [])

//Register the category with the notification center. It is recommended to do this early in the app lifecycle.

center.setNotificationCategories([category])
//To include this action in our notifications we need to set the category in the notification content:

} else {
print("Failed to add notification")
}
}

但是,我希望每隔一天发送一次,并且不想使用 64 次通知限制。

谢谢你的时间

托马斯

最佳答案

假设您想要在从现在起的 2、4 和 6 天后触发通知,您可以按照以下方法进行操作:

在我的示例中,我向 Date 添加了扩展名

extension Date {
func adding(days: Int) -> Date? {
var dateComponents = DateComponents()
dateComponents.day = days

return NSCalendar.current.date(byAdding: dateComponents, to: self)
}
}

然后您可以为指定的日期创建新的通知,在这个例子中是从现在开始的 2、4、6 天

let date = Date()
for i in [2, 4, 6] {
if let date = date.adding(days: i) {
scheduleNotification(withDate: date)
}
}

func scheduleNotification(withDate date: Date) {
let notificationContent = UNMutableNotificationContent()
notificationContent.title = "Title"
notificationContent.subtitle = "Subtitle"
notificationContent.body = "Body"

let identifier = "Make up identifiers here"
let dateComponents = Calendar.autoupdatingCurrent.dateComponents([.day, .month, .year, .hour, .minute, .second], from: date)

let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

let notificationReques = UNNotificationRequest(identifier: identifier, content: notificationContent, trigger: trigger)

UNUserNotificationCenter.current().add(notificationReques) { error in
if let e = error {
print("Error \(e.localizedDescription)")
}
}
}

这应该安排 3 个通知 - 从现在开始的 2、4、6 天......

关于swift - 每 X 天本地通知 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52168772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com