Local Notification


#1

При выборе времени в datePicker и нажатии этой кнопки на устройство приходит сообщение.

@IBAction func tappedButton(_ sender: UIButton) {

    let content = UNMutableNotificationContent()
    content.title = "title."
    content.body = "body"
    content.sound = UNNotificationSound.default
    
    let calendar = Calendar(identifier: .gregorian)
    let dateComponent = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: datePicker.date)
    
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: false)
    
    let identifier = NSUUID().uuidString
    let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
    
    UNUserNotificationCenter.current().add(request){
        error in print(error?.localizedDescription ?? "")
    }
}

Помогите изменить код что бы это была функция которая срабатывала при любом условии, и отправляла такое же сообщение, только без datePicker.


#2

Замените datePicker.date на текущую дату + пару секунд вперед и все должно работать.


#3

сделал так, но что то не срабатывает

let dayToDay = Date()

func sendNotification( ) {

let content = UNMutableNotificationContent()
content.title = "title."
content.body = "body"
content.sound = UNNotificationSound.default

let calendar = Calendar(identifier: .gregorian)
let dateComponent = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: dayToDay)

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

let identifier = NSUUID().uuidString
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

UNUserNotificationCenter.current().add(request){
    error in print(error?.localizedDescription ?? "")
}

}


#4

Я не знаю присылает ли он уведомления для истекших дат, поэтому добавьте минуту к своей дате и формируйте дату внутри метода.


#5

С датой не получается(

Вот этот код работает

func notificationSet() {

    let content = UNMutableNotificationContent()
    content.title = "БлаБла"
    content.body =  "БлаБла"
    content.sound = UNNotificationSound.default
    
    let timeInSeconds: TimeInterval = 2
    
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeInSeconds, repeats: false)
    
    let identifier = NSUUID().uuidString
    
    let request = UNNotificationRequest(identifier: identifier, content: content,trigger: trigger)
    
    UNUserNotificationCenter.current().add(request){
        error in print(error?.localizedDescription ?? "")
    }
}

Есть проблема, notification приходит только тогда, когда я открываю календарь. А надо что бы оно в принципе приходило в указанный день, независимо от того, открыт календарь или нет.

if (currentMonthIndex == 9 && indexPath.item == 10) {
cell.eventView.isHidden = false
if calcDate == todaysDate && currentMonthIndex == 9 && indexPath.item == 10 {
nowDate.text = “Дзылаты Уастырджи. Хуыцаубоны.”
notificationSet()
}
}


#6

Я получил массив дат на весь год

func datesRange(from: Date, to: Date) -> [Date] {
    if from > to { return [Date]() }
        
        var tempDate = from
        var array = [tempDate]
        
     while tempDate < to {
            tempDate = Calendar.current.date(byAdding: .day, value: 1, to: tempDate)!
            array.append(tempDate)
     }
        
     return array
   }

и следующий код позволяет получить уведомление по индексу 0, то есть сегодня.

let today = Date()
let nextOneYearDays = Calendar.current.date(byAdding: .day, value: 365, to: today)!
let myRange = datesRange(from: today, to: nextOneYearDays)
if today == myRange[0] {
     notificationSet(title: "Дзылаты Уастырджи.", body: "Хуыцаубоны.")
}

А можно ли как то вытащить из массива значение, узнать его index? Или только по индексу можно обратиться к массиву?
Или как то сопоставить значение даты в массиве с текущей датой?