获取当前用户屏幕以显示或不显示远程通知警报

时间:2018-04-18 06:53:54

标签: ios swift push-notification apple-push-notifications

我正在我的应用中实现远程通知:

我正在使用

控制应用程序处于前台时远程通知的行为
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification, withCompletionHandler
completionHandler: @escaping (UNNotificationPresentationOptions) ->
Void)

我正在使用这3个不同的选项来完成处理程序:

completionHandler([.alert, .sound])
completionHandler([.sound])

我的应用中有2个屏幕:

  • 主页
  • 会话列表

当用户使用我的应用并收到对话更新的远程通知时,我想要:

  • 如果他在主屏幕上 - > completionHandler([。alert,.sound])
  • 如果他在对话屏幕列表中 - > completionHandler([声音])

我的应用程序有许多不同的屏幕,可以触发不同类型的远程通知。 获取当前查看屏幕并选择所需的完成处理程序的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

一种简单的方法是检查当前的可见控制器(顶视图控制器)。寻找最重要的代码是:

extension UIApplication {
    static 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
    }
}

然后,在选择何时发布通知时,您可以执行以下操作:

if UIApplication.topViewController() is HomeViewController {
    // Top controller is Home
}

这可以从应用程序的任何一点调用。