推送通知无法正常工作,当应用程序在后台时,Swift

Posted

技术标签:

【中文标题】推送通知无法正常工作,当应用程序在后台时,Swift【英文标题】:Push notifications doesn't work properly, when app in background, Swift 【发布时间】:2019-11-27 14:39:41 【问题描述】:

我在我的应用中添加了推送通知。它们用于在用户按下时打开特定屏幕。当应用程序完全关闭以及在前台打开应用程序时,它工作正常。但是,当它在后台时,第一个屏幕是通过按下而不是需要的一个来打开的。

在这里,在 AppDelegate 中,当应用关闭时,我使用推送:

let pushManager = PushNotificationManager(userID: "UserID")
    pushManager.registerForPushNotifications()

    let notificationOption = launchOptions?[.remoteNotification]

    if let notification = notificationOption as? [String: AnyObject],
        let aps = notification["aps"] as? [String: AnyObject] 
        print(aps)
        let storyboard = UIStoryboard(name: "Invoice", bundle: nil)
        guard let returnPage = storyboard.instantiateViewController(withIdentifier:
            "\(InvoiceViewController.self)") as? InvoiceViewController else  return true 
        if let navBar = self.window?.rootViewController as? UINavigationController 
            navBar.pushViewController(returnPage, animated: true)
        
    

在这里,同样在 AppDelegate 中,当应用打开时,我使用推送:

func application(
  _ application: UIApplication,
  didReceiveRemoteNotification userInfo: [AnyHashable: Any],
  fetchCompletionHandler completionHandler:
  @escaping (UIBackgroundFetchResult) -> Void
) 
  guard let aps = userInfo["aps"] as? [String: AnyObject] else 
    completionHandler(.failed)
    return
  

    let storyboard = UIStoryboard(name: "Invoice", bundle: nil)
            guard let returnPage = storyboard.instantiateViewController(withIdentifier:
                "\(InvoiceViewController.self)") as? InvoiceViewController else  return 
    if let navBar = self.window?.rootViewController as? UINavigationController 
        navBar.pushViewController(returnPage, animated: true)
    
  print(aps)

【问题讨论】:

【参考方案1】:

您应该使用以下代码来处理用户对推送通知的响应。

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) 
// handle it here

这是UNUserNotificationCenterDelegate 的一部分,专门用于用户响应,因此您也不必关心应用状态。 我希望它会有所帮助。

编辑:要使用它,首先像这样在 didFinishLaunching 中注册

let replyAction = UNTextInputNotificationAction(identifier: identifier,
                                                        title: "Reply",
                                               options:.authenticationRequired, textInputButtonTitle: "Button", textInputPlaceholder: "")

let newMessageCategory = UNNotificationCategory(identifier: someIdentifier,
                                                        actions: [replyAction],
                                                        intentIdentifiers: [],
                                                        options: [])

        UNUserNotificationCenter.current().setNotificationCategories([newMessageCategory])
UNUserNotificationCenter.current().delegate = self

然后注册上面提到的方法。您将在参数中获得如下信息:

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping Func0) 
        let userInfo = response.notification.request.content.userInfo
        let actionIdentifier = response.actionIdentifier

        if actionIdentifier == UNNotificationDefaultActionIdentifier 
              // handle navigation here
           

         

【讨论】:

你好,谢谢你的回答,但我还是不知道怎么用。在 func 'didFinishWithOptions' 中,我可以像这样使用它的属性:let notificationOption = launchOptions?[.remoteNotification] 和在 func didReceiveRemoteNotification 中,我为此目的使用 userInfo。如何使用您的功能从通知中获取信息?我需要这个知道女巫屏幕才能打开

以上是关于推送通知无法正常工作,当应用程序在后台时,Swift的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于后台状态时,FCM多次推送通知无法正常工作

如何在应用程序处于后台(ios)时使 FCM 通知正常工作?

iOS应用后台主题推送通知

当应用程序未激活(已终止)时,推送通知无法正常工作

当应用程序被杀死时,无法在推送通知单击时导航到特定屏幕(Flutter android)

应用程序处于非活动状态时无法接收静默通知 iOS