gohar94
gohar94

Reputation: 138

How do I open a specific view controller from local notification?

On pressing a button on the local notification, I want to be able to open a specific view controller depending on some information in the notification. How can this be done?

In AppDelegate.swift

let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)

        if let options = launchOptions {
            if let notification = options[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
                if let userInfo = notification.userInfo {
                    let type = userInfo["TYPE"] as! String
                    // do something neat here
                    if (type == "SLEEP") {

                    } else if (type == "STRESS") {

                    } else {

                    }
                }
            }
        }

        return true
    }

Setting the notifications in one of the view controllers

let sleepInPrefs = prefs.valueForKey(key) as? NSDate
if sleepInPrefs != nil {
    print(sleepInPrefs)
    print("Setting stress notif")
    for notification in (UIApplication.sharedApplication().scheduledLocalNotifications )! {
        if (notification.userInfo!["TYPE"]) != nil {
            if (notification.userInfo!["TYPE"] as! String == key) {
                UIApplication.sharedApplication().cancelLocalNotification(notification)
                print("deleting notif")
                break
            }
        }
    }
    let notification = UILocalNotification()
    notification.fireDate = sleepInPrefs
    notification.repeatInterval = NSCalendarUnit.Day
    notification.timeZone = NSCalendar.currentCalendar().timeZone
    notification.alertBody = ""
    notification.hasAction = true
    notification.alertAction = "open"
    notification.soundName = UILocalNotificationDefaultSoundName
    notification.userInfo = ["TYPE": key ]
    notification.category = "PROMPT"
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
}

Upvotes: 4

Views: 5356

Answers (1)

Amit Tandel
Amit Tandel

Reputation: 883

You can pass redirection params and additional info in userInfo of UILocalNotification.

// In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to schedule and present UILocalNotifications

func registerForLocaleNotifications()
{
    let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge , .Sound], categories: nil)
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
}
func scheduleLocalNotification()
{
    let notification = UILocalNotification()
    notification.fireDate = NSDate(timeIntervalSinceNow: 20)//will be fired in 20 seconds
    notification.timeZone = NSTimeZone.defaultTimeZone()
    notification.soundName = UILocalNotificationDefaultSoundName
    notification.alertBody = "Test UILocalNotification"
    notification.userInfo = ["TYPE":"Page1"]
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
}

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification)
{
    if ( application.applicationState == UIApplicationState.Active)
    {
        print("Active")
        // App is foreground and notification is recieved,
        // Show a alert.
    }
    else if( application.applicationState == UIApplicationState.Background)
    {
        print("Background")
        // App is in background and notification is received,
        // You can fetch required data here don't do anything with UI.
    }
    else if( application.applicationState == UIApplicationState.Inactive)
    {
        print("Inactive")
        // App came in foreground by used clicking on notification,
        // Use userinfo for redirecting to specific view controller.
        self.redirectToPage(notification.userInfo)
    }
}

func redirectToPage(userInfo:[NSObject : AnyObject]!)
{
    var viewControllerToBrRedirectedTo:UIViewController!
    if userInfo != nil
    {
        if let pageType = userInfo["TYPE"]
        {
            if pageType as! String == "Page1"
            {
                viewControllerToBrRedirectedTo = UIViewController() // creater specific view controller
            }
        }
    }

    if viewControllerToBrRedirectedTo != nil
    {
        if self.window != nil && self.window?.rootViewController != nil
        {
            let rootVC = self.window?.rootViewController!
            if rootVC is UINavigationController
            {
                (rootVC as! UINavigationController).pushViewController(viewControllerToBrRedirectedTo, animated: true)
            }
            else
            {
                rootVC?.presentViewController(viewControllerToBrRedirectedTo, animated: true, completion: { () -> Void in

                })
            }


        }
    }

}

Upvotes: 3

Related Questions