How to make your push notification Open a certain view controller?

I looked on SO but I wasn’t able to find any question that discusses when you receive a push notification how can you then open a specific view controller.
For example if you are creating an app like WhatsApp and you receive two different push notifications ie messages from two different users how would you direct from the app delegate to the respective viewController?

As far as I know in the userinfo dictionary that the appDelegate gives you you can give an ID to a specific viewController but I don’t know how to give any a tribute to a specific view controller so that then you could again direct to that viewController.
Kindly include a code snippet with your answer

  • UIActivityIndicator not working properly?
  • Basic Drag and Drop in iOS
  • cast value of type 'UITableViewCell' to Custom Cell
  • How to calculate actual font point size in iOS 7 (not the bounding rectangle)?
  • Removing UILocalNotification from notification tray programatically
  • Interface Builder degrades storyboards, resizes and repositions views in small increments
  • **** Swift or Objective-C answers are both acceptable ****

    2 Solutions Collect From Internet About “How to make your push notification Open a certain view controller?”

    You can detect if the app opened from the notification with this code in app delegate. You will need to set the initial view controller when the application state is UIApplicationStateInactive before the app has become active. You can perform any logic there to decide which view controller should be opened and what content should be shown in that view controller.

    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    
        if(application.applicationState == UIApplicationStateActive) {
    
            //app is currently active, can update badges count here
    
        } else if(application.applicationState == UIApplicationStateBackground){
    
            //app is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here
    
        } else if(application.applicationState == UIApplicationStateInactive){
    
            //app is transitioning from background to foreground (user taps notification), do what you need when user taps here
    
            self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
    
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    
            UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];
    
            self.window.rootViewController = viewController;
            [self.window makeKeyAndVisible];
    
        }
    
    }
    

    Here is the Swift 3 Version with switch/case instead of if/else

        open func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
        switch application.applicationState {
        case .active:
            print("do stuff in case App is active")
        case .background:
            print("do stuff in case App is in background")
        case .inactive:
            print("do stuff in case App is inactive")
        }
    }