Kiley
Kiley

Reputation: 419

Swift didReceiveRemoteNotification firing while in app

Here is my code for didReceiveRemoteNotification:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
    print("notification recieved: \(userInfo)")

    // Pass push notification payload to the shared model
    let payload: NSDictionary = userInfo as NSDictionary

    if let variable = payload["variable"] as? String {
        NotificationManager.SharedInstance.handleVariableNotification(variable)
    }
}

The code works and properly does what I want it to when I click on the notification from outside the app.

My issue is: if I get a notification while I'm currently in the app, it still runs the code from the notification and overrides anything the user is currently doing in the app

I only want the code to run if the user clicks on the notification, not automatically if I'm already in the app.

Thanks in advance!

Upvotes: 2

Views: 1308

Answers (2)

Garret Kaye
Garret Kaye

Reputation: 2562

Inside your didReceiveRemoteNotification delegate method:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {

    switch application.applicationState {
    case .active:
        print("Application is open, do not override")
    case .inactive, .background:

        // Pass push notification payload to the shared model
        let payload: NSDictionary = userInfo as NSDictionary

        if let variable = payload["variable"] as? String {
            NotificationManager.SharedInstance.handleVariableNotification(variable)
        }

    default:
        print("unrecognized application state")
    }

}

Also if your application is being launched via user opening a remote notification sent by your application you will need to do this inside your app delegate didFinishLaunchingWithOptions method:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Check to see if launchOptions contains any data
    if launchOptions != nil {

        // Check to see if the data inside launchOptions is a remote notification
        if let remoteNotification = launchOptions![UIApplicationLaunchOptionsKey.remoteNotification] as? NSDictionary {

            // Do something with the notification
        }
    }

    return true
}

Upvotes: 2

arcade16
arcade16

Reputation: 1535

Wrap your code in:

if (application.applicationState != .active){}

It will check if you are currently in the app, and fires the code only if the app was inactive or in the background.

Upvotes: 3

Related Questions