Невозможно перейти к определенному viewController после нажатия push-уведомления на переднем плане с использованием FCM под iOS 10 - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь получить уведомление как на переднем, так и на заднем плане, я получаю уведомление в обоих состояниях, но я не могу перейти на нужный контроллер представления после нажатия на уведомление, когда приложение находится на переднем плане, любая помощь будет высоко оценен, спасибо заранее я использую сторонний для пользовательского баннера, работающего на устройстве iphone 4s, ios 9

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
 // If you are receiving a notification message while your app is in the background,
    // this callback will not be fired till the user taps on the notification launching the application.
    // TODO: Handle data of notification
    // With swizzling disabled you must let Messaging know about the message, for Analytics

    Messaging.messaging().appDidReceiveMessage(userInfo)
    print("In did Recieve Notification")
    // Print message ID.
    print("userInfoNotification=\(userInfo)")
    if let contactID = userInfo["contactID"] as? String {
        self.contactID = contactID
        print(contactID)
    }
    let state = UIApplication.shared.applicationState
    if state == .active {
        print("App in Foreground")

        if self.contactID != AppDelegate.openedChatContactId {
            print("openedID=\(AppDelegate.openedChatContactId)")
            if let aps = userInfo["aps"] as? NSDictionary {
                if let alert = aps["alert"] as? NSDictionary {
                    let body = alert["body"] as! String
                    let title = alert["title"] as! String
                    let banner = Banner(title: title, subtitle: body, image: UIImage(named: "AppIcon"), backgroundColor: UIColor(red:31.00/255.0, green:136.0/255.0, blue:254.5/255.0, alpha:1.000))
                    banner.dismissesOnTap = true
                    banner.show(duration: 3.0)

                      //  let storyboard = UIStoryboard(name: "Main", bundle: nil)
                     //   let viewController = storyboard.instantiateViewController(withIdentifier: "chatMessageVC") as! ChatMessagesVC
                     // UIApplication.shared.keyWindow?.rootViewController = viewController;
                } else if let alert = aps["alert"] as? NSString {
                }
            }
        }
    }

    if state == .inactive || state == .background {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        var destinationViewController = storyboard.instantiateViewController(withIdentifier: "chatMessageVC") as! ChatMessagesVC
        UserDefaults.standard.set(contactID, forKey: "contactID")
        UserDefaults.standard.synchronize()
        destinationViewController.contactID = self.contactID
        let navigationController = self.window?.rootViewController as! UINavigationController
        navigationController.pushViewController(destinationViewController, animated: false)

    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Реализация под расширением UIApplication

extension UIApplication {
    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }
}

Пожалуйста, измените свой код, чтобы перейти к определенному экрану, когда приложение находится на переднем плане.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "chatMessageVC") as! ChatMessagesVC
UIApplication.topViewController()?.navigationController?.pushViewController(viewController, animated: false)

Надеюсь, это вас хорошо устроит, и сообщите мне в случае любых вопросов.

UPDATE

Если приложение работает на переднем плане , iOS не будет показывать баннер / предупреждение. Это по замыслу. Но мы можем достичь этого, используя UILocalNotification следующим образом

if application.applicationState == .active {
    var localNotification = UILocalNotification()
    localNotification.userInfo = userInfo
    localNotification.soundName = UILocalNotificationDefaultSoundName
    localNotification.alertBody = message
    localNotification.fireDate = Date()
    UIApplication.shared.scheduleLocalNotification(localNotification)
}
...