收到 iOS 推送通知时如何打开通知视图控制器? [英] How to Open a Notification view controller when a iOS push notification is received?

查看:28
本文介绍了收到 iOS 推送通知时如何打开通知视图控制器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 swift 4.2 中工作,并且从 FireBase 接收推送通知.当我点击 Notification 时,它会转到主页.但是我想去Notification页面.

I am working in swift 4.2, and Push notification receive from FireBase. When I tap the Notification, it go to Homepage. But I want to go to Notification page.

这是Swift4.2Xcode 9.3iOS 12.1.过去,我尝试过但没有同时运行 ForegroundInActive 应用

This is Swift4.2, Xcode 9.3, iOS 12.1. In the past , I have tried but not working both Foreground and InActive the app

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
    }

推荐答案

For Kill State OR Terminate State:

AppDelegate.swift 文件中定义新属性

Define new property in AppDelegate.swift file

var isFromNotification = false

AppDelegate.swift 中进行以下更改并保持其余代码不变.

Make below changes in AppDelegate.swift and keep rest of code as it is.

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

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

Now, Let's understand the flow about the background or foreground state.

userNotificationCenter(_:didReceive:withCompletionHandler:) 方法是当用户在后台或前台模式下点击通知时调用.

userNotificationCenter(_:didReceive:withCompletionHandler:) method is called when a user clicks on the notification in background or foreground mode.

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

如何抓取当前的 UIViewController 或当前的 UINavigationController

这篇关于收到 iOS 推送通知时如何打开通知视图控制器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆