Reputation: 138
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
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