gpt4 book ai didi

ios - NotificationCenter 在 Swift iOS 中无法从 AppDelegate 工作

转载 作者:行者123 更新时间:2023-12-01 21:56:45 27 4
gpt4 key购买 nike

我在使用 NotificationCenter 时遇到了一个非常愚蠢的问题.

简介:我正在使用 Firebase notification在我的应用程序中,所以基本上任何用户都会收到 notification我们需要将用户导航到特定的 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 的类然后一切正常。我的方法被调用。

最佳答案

我认为这是使用 NotificationCenter 的完全错误的方法,因为首先你必须观察通知,然后只有你可以发布一些东西。如果 ViewController 不在内存中,它就不能听任何东西。我希望你明白我的意思。就像跟聋人打招呼一样。相反,您应该在 didReceive response 中找到顶级 ViewController方法并使用其导航 Controller 进行导航。你可以使用下面的函数来找到最顶层的 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 时它工作的原因是因为它在你发布之前就在内存中。

关于ios - NotificationCenter 在 Swift iOS 中无法从 AppDelegate 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61147135/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com