1

H I need to change the ViewController from my Appdelegate depending on the title shown in my push notification. As you can see in the extension below I am receiving my push notification and testing after I press on it in the foreground mode if it contains the following text: "Dein Freund ist am Joggen". It it contains the text it should switch the viewcontroller. I have tried the methods in the following article:

Opening view controller from app delegate using swift

The main problem is I do not have a window and declaring window: UIwindow? or similar did not help at all. So my question is how can I force to show a Viewcontroller here

I have my storyboard initialized and my requestPage that should be shown.

let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let requestPage = storyboard.instantiateViewController(withIdentifier: "Requester") as! RequestViewController

Here is the complete code of the extension

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {

  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    // Change this to your preferred presentation option
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    let application = UIApplication.shared
     
     if(application.applicationState == .active){
        
       print("user tapped the notification bar when the app is in foreground")
        if(userInfo.description.contains("Dein Freund ist am Joggen")) {
            let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let requestPage = storyboard.instantiateViewController(withIdentifier: "Requester") as! RequestViewController
            
        }
     }
     
     if(application.applicationState == .inactive)
     {
       print("user tapped the notification bar when the app is in background")
     }

    completionHandler()
  }
}

Any ideas ?

Lucas Goldner
  • 617
  • 9
  • 29
  • 1
    The fact that you don't have a window suggests that you are using the UIWindowScene architecture. So the place you want to do all this is the _scene_ delegate; that is where the window is. Looking at a five-year-old discussion is not going to help you here; the scene architecture is much newer than that. – matt Dec 27 '20 at 23:39
  • How can I do this with scenedelegate ? – Lucas Goldner Dec 28 '20 at 00:24

1 Answers1

3

I fixed it seems to be a common problem so I am happy to share my solution. Only works if you have a Scenedelegate in your project!

guard var rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else {
           return
       }
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "Requester") as! RequestViewController
rootViewController.present(controller, animated: true, completion: { () -> Void in

})
Lucas Goldner
  • 617
  • 9
  • 29