Центр уведомлений не работает из AppDelegate в Swift iOS - PullRequest
1 голос
/ 10 апреля 2020

Я сталкиваюсь с очень глупой проблемой при использовании NotificationCenter.

Введение: Я использую Firebase notification в своем приложении, поэтому, как правило, как только любой пользователь получит notification, нам нужно перевести пользователя на указанный экран c ViewController .

Вот мой код:

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

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        let userInfo = response.notification.request.content.userInfo

        if let paymentStatus = userInfo["message"] as? String {

            if paymentStatus == "SUCCESS"{

            // handle notification
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "PaymentSuccessfulNotification"), object: nil, userInfo: userInfo)
            }
        }

        completionHandler()
    }
}

ViewController.swift viewDidLoad метод :

NotificationCenter.default.addObserver(self,selector: #selector(paymentSuccessfulNotificationReceived),
name: NSNotification.Name(rawValue: "PaymentSuccessfulNotification"), object: nil)

И объявил этот метод также:

@objc func paymentSuccessfulNotificationReceived(notification: NSNotification){

        DispatchQueue.main.async {

            // Navigate code
            let viewController = AppManager.VideoCallStoryBoard.instantiateViewController(withIdentifier:  "ViewController") as! ViewController
            self.navigationController?.pushViewController(viewController, animated: false)
        }

    }

Проблема: Когда я получаю Firebase notification, тогда мой AppDelegate's userNotificationCenter: didReceive response: method вызывается , но мой ViewController.swift метод класса не вызывается.

Пожалуйста, кто-нибудь, помогите мне в этом. Спасибо!

Примечание. Вместо этого, если я добавлю свой метод addObserver к классу ViewController, который я устанавливаю как window.rootViewController, тогда все работает нормально. Мой метод вызывается.

1 Ответ

1 голос
/ 13 апреля 2020

Я думаю, что это совершенно неправильный подход к использованию NotificationCenter, потому что сначала вы должны наблюдать уведомление, а только вы можете что-то опубликовать. Если ViewController не находится в памяти, он не может ничего слушать. Я надеюсь, что вы поняли мою точку зрения. Это все равно что поздороваться с глухим человеком. Вместо этого вы должны найти верхний ViewController в методе didReceive response и перемещаться по нему с помощью контроллера навигации. Вы можете использовать приведенную ниже функцию, чтобы найти самый верхний ViewController.

extension UIApplication {

    /** To find top viewcontroller */
    class func topViewController(base: UIViewController? = UIApplication.shared.windows.first { $0.isKeyWindow }?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
}

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

...