ios - 如何从本地通知打开特定的 View Controller ?

标签 ios swift notifications

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

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

在其中一个 View Controller 中设置通知

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

最佳答案

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

//在 iOS 8.0 及更高版本中,您的应用程序必须在能够安排和呈现 UILocalNotifications 之前使用 -[UIApplication registerUserNotificationSettings:] 注册用户通知

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

                })
            }


        }
    }

}

关于ios - 如何从本地通知打开特定的 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35748624/

相关文章:

swift - 使用自定义初始化程序 swift 以编程方式实例化和推送 View Controller

ios - 搜索无法快速进行

swift - 使用计时器与更新来运行游戏 SpriteKit

android - 如何在应用程序启动器图标中显示通知数量

android - android 通知的自定义 View 的大小

iOS 在 didSelectItemAtIndexPath 处展开 CollectionView

ios - IOMobileFramebufferGetLayerDefaultSurface 不适用于 iOS 9

iphone - Facebook iOS SDK 不返回用户电子邮件

ios - ssl中Client Hello包中mshkg000019.blob.core.windows.net的含义

android - NotificationListenerService 获取通知图标?