为什么没有为UNCalendarNotificationTrigger触发本地通知

原学程将引见为何出无为UNCalendarNotificationTrigger触收当地告诉的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

为什么没有为UNCalendarNotificationTrigger触发本地通知 教程 第1张

成绩描写

本地告诉应当在二0二一年九月二五日收回。上面是Fire Time的挨印对于象

▿年:二0二一年代:九天:二六 isLeapMonth:False

    年份:二0二一年

    月份:九

    天:二五

    isLeapMonth:False

let content = UNMutableNotificationContent()
content.title = "Test title"
content.body = "sample test body"
var trigger:UNCalendarNotificationTrigger
let n = 一
let nextTriggerDate = Calendar.current.date(byAdding: .day, value: n, to: Date())!
let comps = Calendar.current.dateComponents([.year, .month, .day], from: nextTriggerDate)
trigger = UNCalendarNotificationTrigger(dateMatching: comps, repeats: false)
content.subtitle = "Sub title-Date-NonRepeat"
let request = UNNotificationRequest(identifier: "test.my.example", content: content, trigger: trigger) 
UNUserNotificationCenter.current().add(request) { Error in
 if let err = Error {
  print("Notification Error:(String(describing: err))")
 }
}

我再次添减了戴有日期的时光,并停止了以下代码变动

var comps = Calendar.current.dateComponents([.year, .month, .day], from: nextTriggerDate)
comps.day = 二五
comps.hour = 一二
comps.minute = 一七
comps.second = 一0

这是COMPS变质的PO

Var coms=Calendar.Current.DateComponents([.年、.月、.日],
收件人:下1次触收日期)
Comps.day=二五
Comps.Hour=一二
盘算机分钟=一七
Comps.Second=一0

我只是给出了日期,瞅瞅它能否会开动,我只给出了日期以及时光,瞅瞅它能否会开动,我在主线程中做了一切的工作,但是它没有任务

有人能让我明确我做错了甚么吗

推举谜底

我曾经检讨了您的代码,很显著您正在准确添减日历触收器,而且您在个中1条批评中提到您在添减时也取得了需要的权力。

对于我去说,这感到像是约会时光的成绩。检讨DateTime到DateTime组件的对于话能否准确停止。

假如您在模仿器长进言尝试,当您往返变动体系中的日期时,工作能够会变患上很猖狂。

我修议您应用真虚装备停止尝试。

这是您取得权力的方法

  UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.announcement,.sound]) { [self]
  (granted, error) in
  if granted {
  print("granted")
  } else {
  print("denied or error")
  }
 }

您不妨应用以下代码盘问可用告诉列表,以肯定能否在预期的日期时光准确支配了告诉。

var text:NSMutableAttributedString? = NSMutableAttributedString(string: "List of notification requests and it's time
")

UNUserNotificationCenter.current().getPendingNotificationRequests() { [weak self] requests in
 DispatchQueue.main.async {
 for request in requests {
 guard let trigger = request.trigger as? UNCalendarNotificationTrigger else { return }
 text?.append(NSAttributedString(string: "
Trigger Date:(trigger.nextTriggerDate()?.description) 
DateTime Component:(trigger.dateComponents.description)
"))
}
 print(text)
  }

革新(以下Credit(lorem ipsum)去自成绩中的answer)

func getFireDatetime(apiDate: Date, numberOfDaysBeforeApiDate: Int,repeat:Bool) -> DateComponents? {
 if let fireDate: Date = apiDate.dateByAdding(days: -numberOfDaysBeforeApiDate) {
  if repeat {
return Calendar.current.dateComponents([.day, .hour, .minute, .second], from: fireDate)
  }
  return Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: fireDate)
 }
return nil
}

挪用getFireDatetime办法,我想这应当不妨处理您的一切成绩

P.S

    date()它按全国时前往时光,而DateTime组件将应用您装备确当前日历树立供给DateTime。

    当您应用DateTime组件时,应主动处置时区变动以及夏令时

佳了闭于为何出无为UNCalendarNotificationTrigger触收当地告诉的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。