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

Posted

技术标签:

【中文标题】获取当前用户屏幕以显示或不显示远程通知警报【英文标题】:get current user screen to display or not remote notification alert 【发布时间】:2018-04-18 06:53:54 【问题描述】:

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

当应用程序在前台时,我正在控制远程通知的行为

func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification, withCompletionHandler
completionHandler: @escaping (UNNotificationPresentationOptions) ->
Void)

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

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

例如,我的应用中有 2 个屏幕:

首页 对话列表

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

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

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

【问题讨论】:

【参考方案1】:

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

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

这可以从应用程序中的任何位置调用。

【讨论】:

这绝对是我需要的。是不是 UIApplication.topViewController() 是 HomeViewController 而不是 UIApplication.topViewController 是 HomeViewController ?

以上是关于获取当前用户屏幕以显示或不显示远程通知警报的主要内容,如果未能解决你的问题,请参考以下文章

Android 通知:如何显示粘滞/更新警报

即使应用程序未运行也显示警报

处理远程推送通知格式

可以创建“隐藏”日历项目以在 iPhone 应用程序中显示通知警报吗?

iOS 从远程通知打开时使用不同的启动画面?

更改/删除远程通知上的按钮或按钮文本[重复]