локальное уведомление не появляется (Swift4) - PullRequest
0 голосов
/ 28 декабря 2018

Мой код ниже должен действовать как будильник.Когда дата и время совпадают, ничего не происходит, но я вижу свою распечатку в файле журнала.Пожалуйста, попробуйте этот код и проверьте, что я делаю неправильно.Казалось, понравилось, это работало раньше.Предполагается, что это все еще происходит в фоновом режиме, если пользователь не использует приложение.

      import UIKit;import AVFoundation;import UserNotifications
class ViewController: UIViewController, UNUserNotificationCenterDelegate {var timer = Timer();var isGrantedAccess = false;var player: AVAudioPlayer?
    var passingDate : Date?
    @IBOutlet var dptext: UITextField!
    let datePicker = UIDatePicker()
    @IBOutlet var taskIDo: UITextView!



    override func viewWillAppear(_ animated: Bool)
    {
    createDatePicker()
        timer  = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(ViewController.testDate), userInfo: nil, repeats: true)
    }

    func playSound() {
        let url = Bundle.main.url(forResource: "fc", withExtension: "mp3")!
        do {
            player = try AVAudioPlayer(contentsOf: url)
            guard let player = player else { return }

            player.prepareToPlay();player.play()} catch let error as NSError {print(error.description)}}


func createDatePicker() {
    datePicker.datePickerMode = .dateAndTime
let toolbar = UIToolbar()
    toolbar.sizeToFit() 

    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
    toolbar.setItems([doneButton], animated: false)

    dptext.inputAccessoryView = toolbar;dptext.inputView = datePicker
  }


    func testDate() {
        if Calendar.current.isDate(datePicker.date, equalTo: Date(), toGranularity: .minute) {
            if let passingDate = passingDate, Calendar.current.isDate(datePicker.date, equalTo: passingDate, toGranularity: .minute)
            {
                                    return
            }

            passingDate = datePicker.date


          if dptext.text != ""
            {

                let c = UNMutableNotificationContent()
                c.title = "Lets Roll"


                let t = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
                let r = UNNotificationRequest(identifier: "any", content: c, trigger: t)

                UNUserNotificationCenter.current().add(r, withCompletionHandler: nil)
                /////


                let when = DispatchTime.now() + 20
                DispatchQueue.main.asyncAfter(deadline: when) {



                }

            } else {
            print("No its not empty")}}}


func donePressed() {

    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .short
    dateFormatter.timeStyle = .short
    dptext.text = dateFormatter.string(from: datePicker.date)
    self.view.endEditing(true)



    }}

1 Ответ

0 голосов
/ 28 декабря 2018

Несколько вещей:

  • Убедитесь, что вы устанавливаете делегат UNUserNotificationCenter.current (). В вашем ViewController.
  • Если вы ожидаете, что это будет отображаться, когда приложение находится на переднем плане, это не правильно.Вам нужно свернуть приложение, чтобы увидеть внутреннее уведомление.
  • Запрос разрешений для уведомлений в делегате приложения:

    center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
                // Enable or disable features based on authorization.
            }
    

Вот кодЯ использовал для проверки вашей конфигурации:

import UIKit
import AVFoundation
import UserNotifications

let center = UNUserNotificationCenter.current() // usernotification center

class ViewController: UIViewController, UNUserNotificationCenterDelegate {
    var timer = Timer()
    var isGrantedAccess = false
    var player: AVAudioPlayer?
    var passingDate : Date?
    @IBOutlet var dptext: UITextField!
    let datePicker = UIDatePicker()
    @IBOutlet var taskIDo: UITextView!

    override func viewWillAppear(_ animated: Bool) {

        center.delegate = self
        createDatePicker()
        timer  = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(testDate), userInfo: nil, repeats: true)

    }

    func playSound() {
        let url = Bundle.main.url(forResource: "fc", withExtension: "mp3")!
        do {
            player = try AVAudioPlayer(contentsOf: url)
            guard let player = player else { return }

            player.prepareToPlay();player.play()} catch let error as NSError {print(error.description)}}


    func createDatePicker() {
        datePicker.datePickerMode = .dateAndTime
        let toolbar = UIToolbar()
        toolbar.sizeToFit()

        let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(donePressed))
        toolbar.setItems([doneButton], animated: false)

        dptext.inputAccessoryView = toolbar;dptext.inputView = datePicker
    }

    @objc func testDate() {
        print("in testDate")
        if Calendar.current.isDate(datePicker.date, equalTo: Date(), toGranularity: .minute) {
            if let passingDate = passingDate, Calendar.current.isDate(datePicker.date, equalTo: passingDate, toGranularity: .minute)
            {
                print("in return")
                return
            }

            passingDate = datePicker.date

            let content = UNMutableNotificationContent()
            content.badge = true
            content.title = "Test"
            content.body = "Lets Roll!"
            content.sound = UNNotificationSound.default

            let t = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true)
            let r = UNNotificationRequest(identifier: "any", content: content, trigger: t)

            UNUserNotificationCenter.current().add(r, withCompletionHandler: { (error) in
                dump(error)
            })

        }
    }

    @objc func donePressed() {

        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .short
        dateFormatter.timeStyle = .short
        dptext.text = dateFormatter.string(from: datePicker.date)
        self.view.endEditing(true)

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...