I want to run some code to update the viewcontroller when my local notification has been sent out, I have tried the function didReceiveLocalNotification
, but it only works when the user clicks on the notification, I was wondering if there was a way to run a function when the notification has been sent out?
The local notification should occur at the schedule time even if the app is closed.
The essential difference between local notifications and push notifications is simple: Local notifications are scheduled by an app locally and are delivered by the same device. Push notifications are sent by a remote server (its provider) which sends these notifications to devices on which the app is installed.
Notifications could be created at any moment (on Foreground, Background or even when the application is terminated/killed).
Overview. Use remote notifications (also known as push notifications) to push small amounts of data to devices that use your app, even when your app isn't running. Apps use notifications to provide important information to users. For example, a messaging service sends remote notifications when new messages arrive.
I think there is no way you can know when your local notification is sent out mainly because you can schedule your local notification or send it right away in case of your app are in background.
According to Apple:
You schedule a local notification by calling
scheduleLocalNotification:
. The app uses the fire date specified in theUILocalNotification
object for the moment of delivery. Alternatively, you can present the notification immediately by calling thepresentLocalNotificationNow:
method.Apps might also find local notifications useful when they run in the background and some message, data, or other item arrives that might be of interest to the user. In this case, an app can present the notification immediately using the
UIApplication
methodpresentLocalNotificationNow:
(iOS gives an app a limited time to run in the background).
There is no way to know when the UILocalNotification
was sent, but it when it has received is some case of course. In your case I suppose you're scheduling a UILocalNotification
so let's divided by parts:
The notification is delivered when the app isn’t open and the user touch it
The delegate for an iOS app implements the application:didFinishLaunchingWithOptions:
method to handle a local notification. It gets the associated UILocalNotification
object from the launch-options dictionary using the UIApplicationLaunchOptionsLocalNotificationKey
key. So you can know where the app was open by touching the UILocalNotification
. See the following code:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let launchNotification = launchOptions?[UIApplicationLaunchOptionsLocalNotificationKey] as? UILocalNotification {
// do anything you want update UIViewController, etc
}
return true
}
The notification is delivered when the app is running and the user touch it
Once the user touch the UILocalNotification
you can handle it using the didReceiveLocalNotification
method and do whatever you want inside it.
The notification is delivered when the app is running and the user don't touch it
In case the user don't touch the UILocalNotification
the only thing you can do to know if your UILocalNotification
was sent is keep a list with the UILocalNotifications
you have scheduled before and check it later(this is not a excellent solution but its work).
Nevertheless always exist the UIApplicationWillEnterForegroundNotification
that can be used to notify the UIViewController
you want to update that the app will enter in foreground like in this way:
private var foregroundNotification: NSObjectProtocol!
override func viewDidLoad() {
super.viewDidLoad()
foregroundNotification = NSNotificationCenter.defaultCenter().addObserverForName(UIApplicationWillEnterForegroundNotification, object: nil, queue: NSOperationQueue.mainQueue()) {
[unowned self] notification in
print("Notified ViewControllerB")
}
}
deinit {
// make sure to remove the observer when this view controller is dismissed/deallocated
NSNotificationCenter.defaultCenter().removeObserver(foregroundNotification)
}
I think you have to think properly what you need to do inside you app when your notification is received in case of the user don't tap it.
I hope this help you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With