3

I made an app that sends a notification after a certain time when you click a button. This notification was created in the ViewController. How do I make my app do something after the User clicks the notification? I am using swift 3 and not using UILocalNotification.

2 Answers2

3

In your app delegate, configure an object to be the user notification center's UNUserNotificationCenterDelegate and implement userNotificationCenter(_:didReceive:withCompletionHandler:).

Note that if the user merely dismisses the notification alert, this method will not be called unless you have also configured a category (UNNotificationCategory) corresponding to this notification, with the .customDismissAction option.

matt
  • 515,959
  • 87
  • 875
  • 1,141
3

UILocalNotification is deprecated in iOS 10. You should use UserNotifications framework instead.

Before all don't forget import UserNotifications

First you should set up UNUserNotificationCenterDelegate.

extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        //  - Handle notification 
    }
}

Than set UNUserNotificationCenter's delegate.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (accepted, _) in
            if !accepted {
                print("Notification access denied.")
            }
        }
        return true
    }

Now you can setup your notification.

func setup(at: Date) {
        let calendar = Calendar.current
        let components = calendar.dateComponents(in: .current, from: date)
        let newComponents = DateComponents(calendar: calendar, timeZone: .current, 
        month: components.month, day: components.day, hour: components.hour, minute: components.minute)

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

        let content = UNMutableNotificationContent()
        content.title = "Reminder"
        content.body = "Just a reminder"
        content.sound = UNNotificationSound.default()

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

        UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
        UNUserNotificationCenter.current().add(request) {(error) in
            if let error = error {
                print("Uh oh! We had an error: \(error)")
            }
        }
    }

And finally handle it!

extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        if response.notification.request.identifier == "textNotification" {
            let appDelegate = UIApplication.shared.delegate as! AppDelegate
            guard let rootVc = appDelegate.window?.rootViewController else { return }
            let alert = UIAlertController(title: "Notification", message: "It's my notification", preferredStyle: .alert)
            let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
            alert.addAction(action)
            rootVc.present(alert, animated: true, completion: nil)
        }
    }
}