当前位置: 首页 > 面试题库 >

应用程序在后台时的Firebase侦听器

金毅
2023-03-14
问题内容

我的childAdded应用程序中有一个通知表的Firebase 事件侦听器,当该应用程序在后台时,我想触发推送通知。

这是监听器:

@objc func observeNotificationsChildAddedBackground() {
    self.notificationsBackgroundHandler = FIREBASE_REF!.child("notifications/\(Defaults.userUID!)")
    self.notificationsBackgroundHandler!.queryOrdered(byChild: "date").queryLimited(toLast: 99).observe(.childAdded, with: { snapshot in
        let newNotificationJSON = snapshot.value as? [String : Any]
        if let newNotificationJSON = newNotificationJSON {
            let status = newNotificationJSON["status"]
            if let status = status as? Int {
                if status == 1 {
                    self.sendPushNotification()
                }
            }
        }
    })
}

func sendPushNotification() {
    let content = UNMutableNotificationContent()
    content.title = "Here is a new notification"
    content.subtitle = "new notification push"
    content.body = "Someone did something which triggered a notification"
    content.sound = UNNotificationSound.default()

    let request = UNNotificationRequest(identifier: "\(self.notificationBackgroundProcessName)", content: content, trigger: nil)
    NotificationCenter.default.post(name: notificationBackgroundProcessName, object: nil)
    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().add(request){ error in
        if error != nil {
            print("error sending a push notification :\(error?.localizedDescription)")
        }
    }
}

当应用程序位于前台时,这非常有用。然后,在我的应用程序委托applicationWillResignActive方法中添加一个后台观察器,以在后台对其进行观察:

func applicationWillResignActive(_ application: UIApplication) {
     NotificationCenter.default.addObserver(self, selector: #selector(MainNavViewController.observeNotificationsChildAdded), name: notificationBackgroundProcessName, object: nil)
}

但是当应用程序在后台运行时,事件观察器不会触发。Ive调查了Firebase Cloud Messenger以解决此问题,并遇到了类似这样的帖子:

是否可以使用Firebase CloudMessaging(FCM)直接从设备发送PushNotifications到特殊的UDID?

但是,我并不是要从一个用户向另一个用户发送推送通知,而是UNNotificationRequest要从数据库侦听器中激活一个。

我也发现了这篇文章:FCM后台通知在iOS中不起作用,
但又一次,这与我的用例不同,因为它是在FIRMessaging框架中使用的。

因此,当应用程序在后台运行时,是否可以运行此数据库侦听器? 如果不是,我是否可以让Firebase CloudMessenger观察表中的更改并发送通知?


问题答案:

设备具有管理后台网络呼叫的方式,因此像这样处理后台推送通知将无法在实际设备上运行。应用程序进入后台后不久,观察者将从内存中删除。我可以通过创建一个Node.js服务器来解决此问题,该服务器观察该notifications表并使用Firebase-
Messenger框架处理推送通知。这实际上很容易。我以这篇博文作为指导: 使用Firebase数据库和Cloud
Messaging在Android设备之间发送通知

但是,只要将包含观察者的对象(在本例中为应用程序委托)传递给后台线程调用,该方法就可以在模拟器中工作( 但在实际设备上则不行 ):

func applicationWillResignActive(_ application: UIApplication) {
     NotificationCenter.default.addObserver(self,
                                            selector: #selector(self.observeNotificationsChildAddedBackground),
                                            name: notificationBackgroundProcessName,
                                            object: self)
}


 类似资料:
  • 我正在使用Firebase,并测试在应用程序处于后台时从服务器向应用程序发送通知。通知发送成功,它甚至出现在设备的通知中心上,但是当通知出现或者即使我单击它,我的FCMessagingService中的onMessageReceived方法也从未被调用。 当我在应用程序处于前台时进行测试时,调用了onMessageReceived方法,所有工作都很好。该问题发生在应用程序在后台运行时。 这是有意为

  • 我试图完成的是解析来自Remotemessage的传入数据,并根据自定义标记对其进行不同的处理。例如,如果数据映射包含一个名为“my_custom_tag”的字段,我希望完全覆盖弹出的标准firebase消息并编写一个自定义消息。 问题是,当应用程序在后台运行时,我放入onMessageReceived的任何代码都不会被触发。当应用程序在前台运行时,它工作得很好,但如果应用程序在后台,它将不会检测

  • 当应用程序在后台时,如何更新包含数据负载的Firebase推送通知?有没有办法在通知中指定通知id给Firebase API? 完整的项目在github https://github.com/akshatashan/FireBaseCloudMessagingDemo中

  • 我可能已经阅读了所有其他与此相关的SO线程,但我找不到答案,而且在Android监视器中也没有日志跟踪。有人对此有提示吗?

  • 我在尝试运行应用程序时面临这个问题: 2014年5月13日1:35:26 PM org.apache.catalina.core.StandardContext listenerStart严重:配置类org.apache.catalina.deploy.applicationListener的应用程序侦听器时出错@6a5b20 java.lang.classnotfoundexception:co