How do I handle ios push notifications when the app is in the foreground?
Asked Answered
O

2

7

How do I set up my AppDelegate to handle push notifications that occur when the app is in the foreground and in the background with swift 3 and ios 10? Including how to make the phone vibrate while in the foreground if I receive a notifcation.

Olivann answered 9/2, 2017 at 2:51 Comment(0)
O
11

Here is how I set up my AppDelegate file to do this:

To handle push notifications, import the following framework:

import UserNotifications

To make the phone vibrate on any device import the following framework:

import AudioToolbox

Make your AppDelegate a UNUserNotificationCenterDelegate:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

In your "didFinishLaunchingWithOptions" add this:

    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert], completionHandler: {(granted, error) in
        if (granted) {
            UIApplication.shared.registerForRemoteNotifications()
        } else{
            print("Notification permissions not granted")
        }
    })

This will determine if the user has previously said that your app can send notifications. If not, handle it how you please.

To get access to the device token once it is registered:

//Completed registering for notifications. Store the device token to be saved later
func application( _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data ) {

    self.deviceTokenString = deviceToken.hexString
}

hexString is an extension I added to my project:

extension Data {
    var hexString: String {
        return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
    }
}

To handle what happens when your app receives a notification in the foreground:

//Called when a notification is delivered to a foreground app.
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    //Handle the notification
    //This will get the text sent in your notification
    let body = notification.request.content.body

    //This works for iphone 7 and above using haptic feedback
    let feedbackGenerator = UINotificationFeedbackGenerator()
    feedbackGenerator.notificationOccurred(.success)

    //This works for all devices. Choose one or the other. 
    AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate), nil)
}

To handle what happens when a users presses on a notification they receive (from your application) while your app is in the background, call the following function:

//Called when a notification is interacted with for a background app.
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    //Handle the notification
    print("did receive")
    let body = response.notification.request.content.body
    completionHandler()

}
Olivann answered 9/2, 2017 at 2:51 Comment(3)
Small correction: func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) is called when a user interacts with the notification. So, when a user taps on a notification, for example. This is not the same as when the APNS delivers the notification to the device.Denudate
I have edited the post to be more clear. Thanks for the tip!Olivann
Oh, great. No problem!Denudate
R
2

I would add to havak5's answer that you can set push notifications to be shown as iOS default push, just like this:

swift code:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        if UIApplication.shared.applicationState == .active {
            completionHandler( [.alert,.sound]) // completionHandler will show alert and sound from foreground app, just like a push that is shown from background app
        }
    }
Renal answered 23/10, 2018 at 15:34 Comment(1)
Thanks for this tip! It's something I overlooked and is very helpful.Olivann

© 2022 - 2024 — McMap. All rights reserved.