Swift - уведомления на определенную дату не отображаются - PullRequest
3 голосов
/ 17 июня 2019

Я создаю приложение, в котором пользователи могут создавать «воспоминания» с заголовком, описанием, датой и картинкой. После нажатия кнопки «Сохранить» я хочу, чтобы приложение могло уведомлять пользователя о дате, которую он выбрал, о начале его мероприятия. Я попробовал этот код, но он не работает. я буду рад, если вы сможете исправить мой код или помочь мне найти проблему:)

future = sender.date (отправитель внутри UIDatePicker)

(и, конечно, я написал import UserNotifications)

@IBAction func saveMemorey(_ sender: UIButton) {        

    // User Notification code
    let center = UNUserNotificationCenter.current()
    let content = UNMutableNotificationContent()

    content.title = "New MEmorey!"
    content.subtitle = "A New Event Starts Today:"
    content.body = txtTitle.text!

    content.sound = UNNotificationSound.default
    content.threadIdentifier = "local-notifications temp"

        let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: future)

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

        let request = UNNotificationRequest(identifier: "content", content: content, trigger: trigger)

        center.add(request) { (error) in
            if error != nil {
                print (error)
        }
    }

    self.navigationController?.popViewController(animated: true) // Returns to the memories page after clicking 'save'
}

AppDeligate:

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()

    let center = UNUserNotificationCenter.current()
    let options : UNAuthorizationOptions = [.sound, .alert]

    center.requestAuthorization(options: options) { (granted, error) in
        if error != nil {
            print (error)
        }
    }

    center.delegate = self
    return true
}

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.alert, .badge, .sound])
}

future связано:

 class AddMemoryViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {

var future = Date()
var dateToSet : Double = 0.0

// connections from storyboard to the code

@IBOutlet weak var countLabel: UILabel!

@IBAction func datePickerChanged(_ sender: UIDatePicker) {
     future = sender.date

    //Use midnight today as the starting date
    guard let today = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date()) else { return }

    //Calculate the number of days between today and the =user's chosen day.
    let difference = Calendar.current.dateComponents([.day], from: today, to: future)
    guard let days = difference.day else { return }
    let ess = days > 1 ? "s" : ""
    if (days > 0)
    {
        countLabel.text = "That date is \(days) day\(ess) away."
    }
    if (days < 0)
    {
        countLabel.text = " \(abs(days)) day\(ess) since the event."
    }
    if (days == 0)
    {
        countLabel.text = " The event is today!"
    }
    dateToSet = Double(self.future.millisecondsSince1970)

}

1 Ответ

1 голос
/ 17 июня 2019

В AppDelegate вам необходимо сначала request authorization от пользователя отправлять уведомления на устройство в application(_:didFinishLaunchingWithOptions:) method, т.е.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (allowed, error) in
        if allowed {
            print("User has allowed notifications")
        } else {
            print("User has declined notifications")
        }
    }
    return true
}

. В приведенном выше кодеВы можете предоставить options согласно вашему требованию.Обратитесь по этой ссылке , чтобы узнать о более возможных options.

Затем, как только пользователь authorization успешно, вы можете запланировать notifications, используя свой код.

Edit-1:

Только для отладки выполните код, установив значение future как:

let future = Date(timeIntervalSinceNow: 10)

Это сnotification после 10 seconds из current Date().

Edit-2:

Действие saveMemory выполняется следующим образом:

@IBAction func saveMemorey(_ sender: UIButton) {
    let content = UNMutableNotificationContent()
    content.title = "New Memory!"
    content.subtitle = "A New Event Starts Today:"
    content.body = ""
    content.sound = .default

    let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: future)
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

    let request = UNNotificationRequest(identifier: "content", content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request) { (error) in
        if error != nil {
            print (error)
        }
    }
}

Edit-3:

Вот как я получаю future date, используя UIDatePicker

class VC: UIViewController {
    @IBOutlet weak var datePicker: UIDatePicker!

    var future: Date {
        return self.datePicker.date
    }

    @IBAction func saveMemorey(_ sender: UIButton) {
        //your code here....
    }

    //rest of the code...
}

В приведенном выше коде future это computed property, что returns независимоdate устанавливается в datePicker в этот момент времени.

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