I am trying to figure out whether I can accomplish my goal through Local Notifications, or whether I need to switch to Remote Notifications.
I'm practicing iOS 10 / Swift 3 by building an alarm program that plays the latest episode of a RSS-updated radio show at a set time of day. When the app is in the foreground, this is easy to execute through UNUserNotificationCenterDelegate's willPresent function. I just use willPresent to fetch the latest episode, and play it through an AVAudio Player.
Of course, if the app only works in the foreground, this functionality is very limited. I would want the app to work the same way when in the background or closed.
I can see from the documentation that willPresent does not run when the app isn't in the foreground. Is there another way to have Local Notifications execute code prior to pushing the notification when the app is in the background? Or will I have to switch to Remote Notifications? I see this answer to a related question but I'm wondering if there's a more elegant approach.
For iOS 10 local notifications your out of luck.
For iOS 10 remote notifications —regardless of user interaction you can receive callbacks using
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
. (It's kind of confusing that they deprecated most notification related methods but not this one)Callback for when app is in foreground and you're about to show the notification:
Callback for when app is either in background or in foreground and user tapped on an action:
e.g. gives you a callback that user tapped on Save.
Callback for when app is either in background, foreground or (possibly) suspended state and a Push Notifications (Remote or silent notification) arrives:
Prior to iOS10 when you tapped on the notification the
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
would get called.But since iOS 10
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
isn't called upon tapping. It's only called upon arrival of a remote Notification. (It get's called both in foreground and in background)For pre iOS 10, you can just use the old
didReceiveLocalNotification
function and capture the arrival of any notification.