在前台单击推送通知横幅后如何触发操作

Posted

技术标签:

【中文标题】在前台单击推送通知横幅后如何触发操作【英文标题】:How to trigger an action once the push notification banner is clicked on foreground 【发布时间】:2017-11-17 10:37:02 【问题描述】:

到目前为止,当我处于前台和后台状态时,我都会收到推送通知并显示横幅。但是,尽管它在后台运行良好,但当我在前台时,一旦我单击横幅,我就无法触发打开特定视图控制器的操作(仅当我单击横幅时才应打开)。我该怎么做。我的代码如下

func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
    

        print("Recived: \(userInfo)")

        completionHandler(.newData)


        if state == .background 
            if mediaId != nil
                DispatchQueue.main.async 
                    let storyboard = UIStoryboard(name: "Main", bundle: nil)
                    let mP3ViewController = storyboard.instantiateViewController(withIdentifier:"MP3ViewController") as! MP3ViewController
                    mP3ViewController.media_ID = mediaId
                    self.navigationController?.pushViewController(mP3ViewController, animated:true)

                

            
        else if state == .active 
      //What sould i do here to get the click 

            print("Running on foreground")
            UIApplication.shared.applicationIconBadgeNumber = 0
            let count = 0
            UserDefaults.standard.setValue(count, forKey: "PUSH_COUNT")
            UserDefaults.standard.synchronize()


        

    

【问题讨论】:

如果应用程序打开,推送通知横幅将不会显示。因为您需要使用自定义横幅,当应用程序在 forgrond 时显示推送通知,您可以获得它的点击事件 在前台收到通知时,您必须从导航控制器中关闭所有视图控制器,然后尝试将您的愿望推送到一个控制器@danu 上面的代码可以很好地显示横幅,无需创建自定义。但是有触发点击事件的麻烦 是的,正如@NitinGohel 提到的,如果您的应用处于前台,您将不会收到横幅通知,但您会收到 didreceiveremotnotification 的回调 public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Swift.Void) completionHandler([.badge, .alert, .sound]) // 这个委托将给我的横幅 【参考方案1】:

试试这个 在 AppDelegate 类中实现 UNUserNotificationCenterDelegate

class AppDelegate: UIResponder, UIApplicationDelegate,UNUserNotificationCenterDelegate 

AppDelegate类中添加波纹管方法

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

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

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

当推送通知出现在前台时,将调用上述方法。

编辑:-

添加这个由交互式通知委托调用的方法

func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, completionHandler: @escaping () -> Void) 
        print("identifier = \(identifier)")
    

编辑2:

func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [AnyHashable : Any], withResponseInfo responseInfo: [AnyHashable : Any], completionHandler: @escaping () -> Void) 
        print("identifier = \(identifier)")
    

【讨论】:

这两个我已经有了,但是我想触发点击动作 没有得到你,你的意思只是在 AppDelegate 的任何地方添加这个?? 先生有没有办法在这里获取我的无 userInfo 对象 print("identifier = (String(describing: identifier))") 根本没有被触发 handleActionWithIdentifier 方法不是已弃用吗?!它们被 didReceiveResponse 方法替换...除非他的目标低于 ios10

以上是关于在前台单击推送通知横幅后如何触发操作的主要内容,如果未能解决你的问题,请参考以下文章

单击推送通知后,当应用程序进入前台时如何显示自定义对话框

当应用程序处于前台时收到推送通知时,是不是可以为 ios 显示横幅?

应用在前台时如何触发苹果推送通知事件?

在 iOS 10 下使用 FCM 在前台单击推送通知后无法导航到特定的 viewController

每个推送通知横幅在 iOS9 上显示两次 [重复]

收到推送通知后如何触发操作[关闭]