简体   繁体   English

应用终止时响应推送通知

[英]responding to push notification when app is TERMINATED

As I am very new to push notifications I have looked at several tutorials that outline the best way to handle remote push notifications when app is terminated and it seems that I still have an issue in my app. 由于我是推送通知的新手,因此我看了几本教程,概述了终止应用程序时似乎处理远程推送通知的最佳方法,并且看来我的应用程序中仍然存在问题。 I am calling didFinishLaunchingWithOptions when push notification is tapped but for some reason the function is skipped over and does not execute the code to open the proper view controller. 当点击推送通知时,我正在调用didFinishLaunchingWithOptions,但是由于某种原因,该功能被跳过,并且不执行代码以打开适当的视图控制器。

Here is the code in AppDelegate 这是AppDelegate中的代码

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
// Override point for customization after application launch.

//UserNotification
let center = UNUserNotificationCenter.current()

center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
    // Enable or disable features based on authorization.
    if granted {
        UIApplication.shared.registerForRemoteNotifications()

        if GlobalService.sharedInstance().g_userDeviceToken == nil {
            //  GlobalService.sharedInstance().g_userDeviceToken = ""


        }
    } else {
        print("Don't Allow")

    }

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

        self.getUserChatRooms()
        let aps = notification["aps"] as! [String: AnyObject]

        let mainNC = self.window?.rootViewController as! UINavigationController
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

        let mainVC = storyboard.instantiateViewController(withIdentifier: String(describing: MainViewController.self)) as! MainViewController
        GlobalService.sharedInstance().g_homeVC = mainVC
        mainVC.didReceiveChat(aps)
        mainNC.pushViewController(mainVC, animated: false)

    }
    ...

//SVProgressHUD
SVProgressHUD.setDefaultStyle(.dark)

//Check UserObj
GlobalService.sharedInstance().g_appDelegate = self
if let userObj = GlobalService.sharedInstance().loadUserObj() {
    GlobalService.sharedInstance().g_userMe = userObj
    startApplication(animated: false)
...
return true
}

then this is the function that is called in MainVC: 那么这就是在MainVC中调用的函数:

  func didReceiveChat (_ notificationDictionary: [String: AnyObject]){
let allChats = GlobalService.sharedInstance().g_aryChatRooms

if let noti_id = notificationDictionary["noti_id"] as? String{
        let pushID = Int(noti_id)
    if pushID != nil {
        for chat in allChats {

            if chat.chat_room_id! == pushID! {
            chtRoom = chat

                 NotificationCenter.default.post(name: Notification.Name(rawValue: Constants.Notifications.GET_MSG), object: self)
            break
            }
        }
    }
}
 }

and then in my viewDidLoad method I add the observer: 然后在我的viewDidLoad方法中添加观察者:

    NotificationCenter.default.addObserver(self,selector: #selector(MainViewController.addChatScn(_:_:)), name: NSNotification.Name(rawValue: Constants.Notifications.GET_MSG), object: nil)

finally I call the method to addChatScn: 最后我调用了addChatScn的方法:

  @objc func addChatScn(_ chatObj: ChatRoomObj, _ msgName: String) {
    let popvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatContainerViewController") as! ChatContainerViewController

    iconContainer.isHidden = true
    add_Msg_Btn.isHidden = true
    popvc.vcA = self
    popvc.m_selectedChatRoom = chatObj
    popvc.msgName = msgName
    self.addChildViewController(popvc)
    popvc.view.center = self.view.center
    popvc.view.bounds.size = CGSize(width: 337, height: 503)

    self.view.addSubview(popvc.view)

    popvc.didMove(toParentViewController: self)
}

In your GlobalService.sharedInstance, Add a boolean value called 'readyToReceivePush'. 在您的GlobalService.sharedInstance中,添加一个名为“ readyToReceivePush”的布尔值。 In your MainVC in your viewDidLoad, set the 'GlobalService.sharedInstance.readyToReceivePush' to true. 在MainVC的viewDidLoad中,将“ GlobalService.sharedInstance.readyToReceivePush”设置为true。 Set it to false if the app goes into the background, and true if it comes back to foreground. 如果应用程序进入后台,则将其设置为false;如果应用程序回到前台,则将其设置为true。

func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    GlobalService.sharedInstance.readyToReceivePush = false
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    GlobalService.sharedInstance.readyToReceivePush = true
}

Once you have that set up, if the user swipes on a notification the 'didReceiveRemoteNotification' will be called. 完成设置后,如果用户在通知上滑动,则将调用“ didReceiveRemoteNotification”。 In that method, if GlobalService.sharedInstance.readyToReceivePush == false, save the userInfo to GlobalService.sharedInstance.savedPushInfo. 在该方法中,如果GlobalService.sharedInstance.readyToReceivePush == false,则将userInfo保存到GlobalService.sharedInstance.savedPushInfo。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if GlobalService.sharedInstance.readyToReceivePush == false {
        GlobalService.sharedInstance.savedPushInfo = userInfo
    } else {
        // Handle notification while the user is in the foreground
    }
}

Once you've done that, in MainVC check if GlobalService.sharedInstance.savedPushInfo != nil. 完成此操作后,在MainVC中检查GlobalService.sharedInstance.savedPushInfo!= nil。 If it is != nil, call your 'didReceiveChat' function or whatever you do to handle the notification's userInfo data. 如果它是!= nil,则调用您的“ didReceiveChat”函数或执行任何处理通知的userInfo数据的操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 应用程序终止时推送通知 - Push notification when app is terminated 当应用未运行(终止)时,通知应用有关远程推送通知的信息 - Notify the app about remote push notification when the app is not running (terminated) 应用未运行/应用终止时如何处理推送通知 - How to handle push notification when app is not running/app is terminated 应用未运行/应用终止时如何获取推送通知 - How to get push notification when app is not running/app is terminated 当应用程序在 ios 13 中的静默推送通知中终止时运行代码 - Run code when app is terminated on silent push notification in ios 13 应用终止时处理远程推送通知的声音 - Handling remote push notification sounds when app is terminated FCM iOS 推送通知在应用程序终止时捕获自定义数据? - FCM iOS push notification capture custom data when app is terminated? 如果应用终止,则未收到iOS FCM推送通知 - iOS FCM push notification not received if app is terminated 应用终止时的远程通知 - Remote notification when app is terminated 当应用程序从后台收到推送通知或在iOS中终止时,无法收听来自NSNotificationCenter的通知 - Unable to listen notification from NSNotificationCenter when App received push notification from background or terminated in iOS
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM