首页 > 解决方案 > 如何在不点击横幅或显示通知之前访问推送通知响应?

问题描述

我以这种方式在我的应用程序中实现了推送通知

//MARK:- Register notifications

func registerForPushNotifications() {

    if #available(iOS 10.0, *){

        let center = UNUserNotificationCenter.current()
        center.delegate = self
        center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
            if (granted)
            {
                UIApplication.shared.registerForRemoteNotifications()
            }
            else{
                //Do stuff if unsuccessful...
            }
            // Enable or disable features based on authorization.
        }
    }

    else
    {
        //If user is not on iOS 10 use the old methods we've been using
        let types: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
        let settings: UIUserNotificationSettings = UIUserNotificationSettings( types: types, categories: nil )
        UIApplication.shared.registerUserNotificationSettings( settings )
        UIApplication.shared.registerForRemoteNotifications()

    }

}

//MARK: Push Notifications Delegate Methods

func application( _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data ) {

    var token = ""

    for i in 0..<deviceToken.count {
        //token += String(format: "%02.2hhx", arguments: [chars[i]])
        token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
    }

    USER_DEFAULTS.setValue(token, forKey: "Device_ID")

    USER_DEFAULTS.synchronize()

}

func application( _ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error ) {
    print( error.localizedDescription )

}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {

    UIApplication.shared.applicationIconBadgeNumber = 0

    alertRemoteNotification(userInfo as NSDictionary)
}

//Code for showing alert when in foreground

func alertRemoteNotification(_ userInfo : NSDictionary)
{
    if UIApplication.shared.applicationState == .active {

        if let aps = userInfo as? NSDictionary {

            if let apsDidt = aps.value(forKey: "aps") as? NSDictionary {

                if let alertDict = apsDidt.value(forKey: "alert") as? NSDictionary {

                    if let notification_type = alertDict.value(forKey: "name") as? String {

                        if let notification_Message = alertDict.value(forKey: "body") as? String {

                            let alert = UIAlertController(title: notification_type.capitalized + " Alert", message: notification_Message, preferredStyle: UIAlertControllerStyle.alert)
                            let okayBtn = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in

                                // When Okay

                            UIApplication.shared.applicationIconBadgeNumber = 0

                                if #available(iOS 10.0, *) {

                                    let center = UNUserNotificationCenter.current()
                                    center.removeAllDeliveredNotifications() // To remove all delivered notifications
                                    center.removeAllPendingNotificationRequests()
                                } else {
                                    // Fallback on earlier versions
                                    UIApplication.shared.cancelAllLocalNotifications()
                                }

                                let rootViewController = self.window!.rootViewController as! UINavigationController
                                let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                                let dashBoardVC = mainStoryboard.instantiateViewController(withIdentifier: "DashBoardVC") as! DashBoardVC
                                rootViewController.pushViewController(dashBoardVC, animated: false)                                    
                            })
                            let cancelBtn = UIAlertAction(title: "Cancel", style: .default, handler: { (action) -> Void in

                                UIApplication.shared.applicationIconBadgeNumber = 0

                                if #available(iOS 10.0, *) {

                                    let center = UNUserNotificationCenter.current()
                                    center.removeAllDeliveredNotifications() // To remove all delivered notifications
                                    center.removeAllPendingNotificationRequests()
                                } else {
                                    // Fallback on earlier versions
                                    UIApplication.shared.cancelAllLocalNotifications()
                                }
                            })
                            alert.addAction(okayBtn)
                            alert.addAction(cancelBtn)

                            self.window?.rootViewController!.present(alert, animated: true, completion: nil)
                        }
                    }
                }
            }
        }
    }
    else {

        let rootViewController = self.window!.rootViewController as! UINavigationController
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let dashBoardVC = mainStoryboard.instantiateViewController(withIdentifier: "DashBoardVC") as! DashBoardVC
        rootViewController.pushViewController(dashBoardVC, animated: false)
    }
}

//Delegate methods

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

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

    UIApplication.shared.applicationIconBadgeNumber = 0

}

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

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

    completionHandler()

    self.alertRemoteNotification(userInfo as NSDictionary)
}

我可以在点击通知横幅后访问响应,但实际问题是当我在前台时,我需要在不点击通知横幅的情况下显示带有通知响应的警报。请让我知道如何在不点击通知横幅的情况下获得响应。

标签: iosswiftpush-notificationapple-push-notifications

解决方案


iOS 10+ 提供委托userNotificationCenter:willPresentNotification:withCompletionHandler

询问代理如何处理在应用程序在前台运行时到达的通知。

这只会在应用程序打开时调用。

您也可以使用CONTENT-AVAILABLE=1触发方法。

:(没有录音通知,content-available:1

应用打开状态:-(willPresentNotificationios10+)->didReceiveRemoteNotification:fetchCompletionHandler

后台应用程序:-didReceiveRemoteNotification:fetchCompletionHandler

应用已关闭:- 除非通过单击通知打开应用,否则您不会收到通知数据

替代方法:使用富通知

您可以使用通知扩展来创建自定义推送通知(内容包括图像/视频)。通知服务扩展通知内容扩展用于实现这一点。mutable-content:1需要触发这个。在这里您可以下载图像,获取数据等。[但数据只能通过 UserDefaults(App Groups) 与 App 共享,如果我错了请纠正我]

您可以搜索一些随机教程


推荐阅读