如何在收到iOS推送通知时打开通知视图控制器?

问题描述 投票:1回答:2

我在swift 4.2工作,推送通知从FireBase收到。当我点击Notification时,它会进入主页。但我想去Notification页面。

这是Swift4.2Xcode 9.3iOS 12.1。在过去,我尝试过但不同时使用Foreground和InActive应用程序

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        FirebaseApp.configure()

        UINavigationBar.appearance().barTintColor = UIColor(red: 0/255.0, green: 85/255.0, blue: 127/255.0, alpha: 1)
        UINavigationBar.appearance().tintColor = UIColor.white
        //        UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white,NSAttributedString.Key.font: UIFont(name: "Roboto-Medium", size: 16)!]
        UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -60), for:UIBarMetrics.default)
        UINavigationBar.appearance().isTranslucent = false

        UIApplication.shared.statusBarStyle = .lightContent

        IQKeyboardManager .shared().isEnabled = true
        IQKeyboardManager .shared().shouldResignOnTouchOutside = true
        IQKeyboardManager .shared().isEnableAutoToolbar = false

        if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {

            // If your app wasn’t running and the user launches it by tapping the push notification, the push notification is passed to your app in the launchOptions

            let aps = notification["aps"] as! [String: AnyObject]
            UIApplication.shared.applicationIconBadgeNumber = 0


        }            

        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().delegate = self
            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: {_, _ in })
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
        }

        application.registerForRemoteNotifications()


        let mainview = UIStoryboard(name:"Main", bundle: nil).instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
        let nav = UINavigationController.init(rootViewController: mainview)
        SideMenu = LGSideMenuController.init(rootViewController: nav)
        SideMenuView = UIStoryboard(name:"Main", bundle: nil).instantiateViewController(withIdentifier: "SideMenuViewController") as! SideMenuViewController
        SideMenu.rightViewStatusBarVisibleOptions = .onAll
        let rect = SideMenuView.view.frame;
        SideMenuView.view.frame = rect


        Messaging.messaging().delegate = self
        //        Siren.shared.wail()

        if launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] != nil {
            // Do your task here
            let dic = launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] as? NSDictionary
            let dic2 = dic?.value(forKey: "aps") as? NSDictionary
            let alert = dic2?.value(forKey: "alert") as? NSDictionary
            let category = dic2?.value(forKey: "title") as? String
            // We can add one more key name 'click_action' in payload while sending push notification and check category for indentifying the push notification type. 'category' is one of the seven built in key of payload for identifying type of notification and take actions accordingly
            if category == "News Added"
            {
                /// Set the flag true for is app open from Notification and on root view controller check the flag condition to take action accordingly
                AppConstants.sharedInstance.userDefaults.set(true, forKey: AppConstants.sharedInstance.kisFromNotificationSecond)
            }
            else if category == "1-2-1 notification"
            {
                AppConstants.sharedInstance.userDefaults.set(true, forKey: AppConstants.sharedInstance.kisFromNotificationThird)
            }
        }


        return true
    }
ios apple-push-notifications swift4.2
2个回答
0
投票

对于杀戮州或终止州:

在AppDelegate.swift文件中定义新属性

var isFromNotification = false

在AppDelegate.swift中进行以下更改并保留其余代码。

if launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] != nil {
    isFromNotification = true
    //other required code
}

转到您的Homepage.swift文件

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated).

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    if appDelegate.isFromNotification {
        appDelegate.isFromNotification = false
        //Push to your notification controler without animation
    }
}

更新:用于背景和前景状态

以上答案仅适用于@Abu Ul Hassan评论中提到的杀戮状态

现在,让我们了解有关背景或前景状态的流程。

当用户在后台或前台模式下单击通知时,将调用userNotificationCenter(_:didReceive:withCompletionHandler:)方法。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    //other required code
    //Get current navigation controller and redirect into notification screen
    completionHandler()
}

How to grab current UIViewController or current UINavigationController

如果工作,请标记为已接受。

谢谢


0
投票

这里有两种情况要处理,一种是在application活着的时候,另一种是在没有的时候。

当应用程序处于活动状态时,您将在didReceiveNotificationResponseUserNotificationCenterDelegate函数中收到回调函数。您可以相应地处理它。

当应用程序启动时,您将必须使用UIApplication.LaunchOptionsKey.remoteNotification中的didFinishLaunchingWithOptions函数获得的AppDelegate密钥

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.