Почему локальное уведомление не срабатывает

#ios #uilocalnotification

Вопрос:

В приведенных ниже обстоятельствах я нахожу, что локальное уведомление не срабатывает

  • Если я добавлю уведомление ( с триггером времени), в то время как разрешение на уведомление не предоставлено, если пользователь включает уведомление через настройки. ранее добавленное уведомление не срабатывает
               UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["my.test"])
              UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: ["my.test"])
    
    content.title = "test"
                 content.body = "tap me"
    
                 // 3
                 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 61, repeats: true)
                 let request = UNNotificationRequest(identifier: "my.test", content: content, trigger: trigger)
     
  • Если я смогу отменить запланированное и доставленное уведомление, то новые уведомления не будут запущены
     UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["my.test"])
                  UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: ["my.test"])
     
  • Иногда я замечаю , что если приложение находится на переднем плане, оно не запускается, даже если разрешение предоставлено
  • Иногда мой триггер времени не работает, даже если разрешение предоставлено

пусть триггер = UNTimeIntervalNotificationTrigger(время срабатывания: 11, повторы: ложь)

  • Что происходит, когда пользователь держит телефон в режиме «Не беспокоить«. Как нам с этим справиться ? Я знаю, что это отключает уведомление, что означает, что, когда пользователь разблокирует экран, он сможет увидеть уведомление
  • Что происходит, когда пользователь держит телефон в режиме полета ? ( Я имею в виду, будет ли уведомление доставлено в определенное время, и телефон находится в режиме полета ) ? видит ли пользователь уведомление, когда режим полета выключен.

Может ли кто-нибудь прояснить этот и другие сценарии, о которых я должен знать, чтобы обрабатывать отображение уведомлений

Код

 import UIKit
import Foundation

class TabBar1: UITableViewController {
        
    @IBOutlet weak var tblCell1: UITableViewCell!
    
    @IBOutlet weak var tblCell2: UITableViewCell!
    
    @IBOutlet weak var tblCell3: UITableViewCell!
    
    @IBOutlet weak var tblCell4: UITableViewCell!
    
    @IBOutlet weak var tblCell5: UITableViewCell!
    
    @IBOutlet weak var tblCell6: UITableViewCell!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        tblCell1?.textLabel?.text="Get Notification Permission"
        tblCell2?.textLabel?.text="Fire a notification in one minute"
        tblCell3?.textLabel?.text="Remove all notification"
        tblCell4?.textLabel?.text="Disable Notification Permission"
        tblCell5?.textLabel?.text="Present View controller"
        tblCell6?.textLabel?.text="Push View controller"
        tableView.tableFooterView = UIView()
        tableView.reloadData()
    }

    @objc func applicationDidBecomeActive(notification: NSNotification) {
        tableView.reloadData()
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        DispatchQueue.main.async {
            if indexPath.row == 0 {
                UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.announcement,.sound]) { [self]
                    (granted, error) in
                    if granted {
                        self.showMessage(msg: "Notification Permission Granted")
                    } else {
                        self.showMessage(msg: "Notification Permission Denied")
                    }
                }
            }
            else if indexPath.row == 1 {
                let content = UNMutableNotificationContent()
                content.title = "Test title"
                content.body = "sample test body"
                
                let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 11, repeats: false)
                let request = UNNotificationRequest(identifier: "test.my.example", content: content, trigger: trigger)
                
                UNUserNotificationCenter.current().add(request) { Error in
                    
                    if let err = Error {
                        self.showMessage(msg: "Error during Notification add")
                        print("Notification Error:(String(describing: err))")
                    }
                    else {
                        self.showMessage(msg: "No Error Report while adding Notification")
                    }
                }
            }
            else if indexPath.row == 2{
                UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["test.my.example"])
                UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: ["test.my.example"])
                self.showMessage(msg: "All pending and delivered notifications are removed")
            }
            else if indexPath.row == 3{
                UIApplication.shared.openURL(URL(string: UIApplication.openSettingsURLString)!)
            }
            else if indexPath.row == 4{
                self.present(PresentedViewController(), animated: true) {
                }
            }
            else{
                self.navigationController?.pushViewController(PushedViewController(), animated: true)
            }
        }
    }

    func showMessage(msg:String) {
        DispatchQueue.main.async {

        let alertController = UIAlertController(title: "Notification", message:
                                                    msg, preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Dismiss", style: .default))
            self.present(alertController, animated: true, completion: nil)
        }
    }
}