Как сделать локальные уведомления по расписанию на Swift?

Добрый день.
Суть приложения: в указанную дату и время приложение должно "выбрасывать" локальные уведомления с определенными фразами. Фразы не пересекаются, по этому повторение сделать не получится.
Как задать для каждой фразы отдельное время и дату?
В Swift новичок. Стараюсь разбираться. Но после того как погуглил уже каша в голове.
По обучалкам сделал сейчас код, который работает, но работает по задержке в 10 секунд. То ест после нажатия на кнопку через 10 сек кидается пуш.
Как сделать так, что бы либо я просто поставил разные задержки(к примеру 3,6,9,12,15 часов для каждой фразы), или перестроить код что бы разделить каждое уведомление?
Мне даже не обязательно, что бы это все было по нажатию кнопки. Просто заходишь в приложение, принимаешь запрос на уведомления - и они приходят по часам.
Вопрос возможно покажется очень тупой. Не судите строго. Код прикрепил.

import UIKit
import UserNotifications

class ViewController: UIViewController {
    
    @IBAction func sendNotification(sender: UIButton){
        scheduleNotification(inSeconds: 10) {(success) in
            if success {
                print("We send it")
            } else {
                print("Failed")
            }
        }
    }
    
    func scheduleNotification(inSeconds seconds:TimeInterval, completion: (Bool) -> ()) {
     
        removeNotification(withIdentifiers:["Bear"])
        
        let date = Date(timeIntervalSinceNow: seconds)
        print (Date())
        print(date)
        
        let content = UNMutableNotificationContent()
        content.title = "Текст"
        content.body = "Текст"
        content.sound = UNNotificationSound.default()
        
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents([.month, .day, .hour, .minute, .second], from: date)
        let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: false)
        let request = UNNotificationRequest(identifier: "Bear", content: content, trigger: trigger)
        
        let center = UNUserNotificationCenter.current()
        center.add(request, withCompletionHandler: nil)
        
    }
    
    
    
    
    
        
    func removeNotification(withIdentifiers identifiers: [String]) {
        let center = UNUserNotificationCenter.current()
        center.removePendingNotificationRequests(withIdentifiers: identifiers)
    }
    
    deinit {
        removeNotification(withIdentifiers: ["Bear"])
    }
    
}
  • Вопрос задан
  • 524 просмотра
Пригласить эксперта
Ответы на вопрос 1
maestrro712
@maestrro712
 iOS Developer
Вы уже практически сделали все, что было нужно. Осталось несколько штрихов.

1. Сейчас функция scheduleNotification создаёт нотификации с одним и тем же id. Новые нотификации перетирают старые. Лучше в качестве id использовать или константы, или что-то связанное с заголовком: "\(content.title.hash)".
2. Текст надо вынести в параметры функции:
func scheduleNotification(inSeconds seconds:TimeInterval, text: String, completion: (Bool) -> ())
. Тогда можно будет его использовать для создания нотификации: content.title = text.
3. deinit нужно убрать совсем. Он удаляет вашу нотификацию при удалении экрана из памяти.
4. Если нужно ставить нотификации без нажатия кнопки, то можно использовать метод viewDidLoad() из этого же класса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы