如何从本地通知中打开特定的视图控制器?

时间:2016-03-02 13:30:21

标签: ios swift notifications

按下本地通知上的按钮,我希望能够根据通知中的某些信息打开特定的视图控制器。如何才能做到这一点?

在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
    }

在其中一个视图控制器中设置通知

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)
}

1 个答案:

答案 0 :(得分:3)

您可以在UILocalNotification的userInfo中传递重定向参数和其他信息。

//在iOS 8.0及更高版本中,您的应用程序必须使用 - [UIApplication registerUserNotificationSettings:]注册用户通知,然后才能安排和显示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

                })
            }


        }
    }

}