应用程序在后台时的 Firebase 侦听器
Firebase listener when app is in the background
我的应用程序中有一个 Firebase childAdded
通知 table 事件侦听器,我想在应用程序处于后台时触发推送通知。
这里是监听器:
@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)
}
但是当应用程序处于后台时,事件观察器不会触发。我研究了 Firebase Cloud Messenger 来解决这个问题并遇到了 posts 这样的:
但是我并没有尝试将推送通知从一个用户发送到另一个用户,我正在尝试从数据库侦听器中激活 UNNotificationRequest
。
我也发现了这个post:
但同样,这与我的用例不同,因为它在 FIRMessaging
框架内使用。
那么,应用程序在后台时,是否可以运行这个数据库监听器?如果没有,我是否可以让 Firebase Cloud Messenger 观察 table 中的变化并发送通知?
设备有自己的管理后台网络调用的方式,因此在真实设备上无法像这样处理后台推送通知。应用程序进入后台后不久,观察者就会从内存中删除。我能够通过创建一个 Node.js 服务器来解决这个问题,该服务器观察 notifications
table 并使用 Firebase-Messenger 框架处理推送通知。这实际上很容易。我使用此博客 post 作为指导:
Sending notifications between Android devices with Firebase Database and Cloud Messaging
只要您将包含观察者(在本例中为应用委托)的对象传递给后台,此方法就可以在模拟器中使用(但不能在真实设备上使用)像这样的线程调用:
func applicationWillResignActive(_ application: UIApplication) {
NotificationCenter.default.addObserver(self,
selector: #selector(self.observeNotificationsChildAddedBackground),
name: notificationBackgroundProcessName,
object: self)
}
简单的解决方案是使用后台提取。您还可以使用后台获取定期获取新条目的 table 并在添加新行时显示通知。
这不能保证立即收到通知。但与使用 APN 相比,实现要简单得多。
我遇到了同样的问题,几个月前遇到了你的 post。我终于明白在后台观察通知需要什么了。
我已经详细说明了我在这个 post
中使用的解决方案
技巧如下
- 使用自定义数据服务class
- 初始化数据服务的共享实例class
- 调用数据服务中的相应函数class
来自初始视图控制器的 sharedInstance。
这样观察者就会留在记忆中
更新: Apple 已经实施了有关后台模式的更新,这导致此方法无法运行。
您可以将后台任务添加到 firebase observer
@objc func observeNotificationsChildAddedBackground() {
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
backgroundTask = UIApplication.shared.beginBackgroundTask {
[unowned self] in
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
assert(backgroundTask != UIBackgroundTaskInvalid)
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()
}
}
}
})
}
我的应用程序中有一个 Firebase childAdded
通知 table 事件侦听器,我想在应用程序处于后台时触发推送通知。
这里是监听器:
@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)
}
但是当应用程序处于后台时,事件观察器不会触发。我研究了 Firebase Cloud Messenger 来解决这个问题并遇到了 posts 这样的:
但是我并没有尝试将推送通知从一个用户发送到另一个用户,我正在尝试从数据库侦听器中激活 UNNotificationRequest
。
我也发现了这个post:
FIRMessaging
框架内使用。
那么,应用程序在后台时,是否可以运行这个数据库监听器?如果没有,我是否可以让 Firebase Cloud Messenger 观察 table 中的变化并发送通知?
设备有自己的管理后台网络调用的方式,因此在真实设备上无法像这样处理后台推送通知。应用程序进入后台后不久,观察者就会从内存中删除。我能够通过创建一个 Node.js 服务器来解决这个问题,该服务器观察 notifications
table 并使用 Firebase-Messenger 框架处理推送通知。这实际上很容易。我使用此博客 post 作为指导:
Sending notifications between Android devices with Firebase Database and Cloud Messaging
只要您将包含观察者(在本例中为应用委托)的对象传递给后台,此方法就可以在模拟器中使用(但不能在真实设备上使用)像这样的线程调用:
func applicationWillResignActive(_ application: UIApplication) {
NotificationCenter.default.addObserver(self,
selector: #selector(self.observeNotificationsChildAddedBackground),
name: notificationBackgroundProcessName,
object: self)
}
简单的解决方案是使用后台提取。您还可以使用后台获取定期获取新条目的 table 并在添加新行时显示通知。
这不能保证立即收到通知。但与使用 APN 相比,实现要简单得多。
我遇到了同样的问题,几个月前遇到了你的 post。我终于明白在后台观察通知需要什么了。
我已经详细说明了我在这个 post
中使用的解决方案技巧如下
- 使用自定义数据服务class
- 初始化数据服务的共享实例class
- 调用数据服务中的相应函数class 来自初始视图控制器的 sharedInstance。
这样观察者就会留在记忆中
更新: Apple 已经实施了有关后台模式的更新,这导致此方法无法运行。
您可以将后台任务添加到 firebase observer
@objc func observeNotificationsChildAddedBackground() {
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
backgroundTask = UIApplication.shared.beginBackgroundTask {
[unowned self] in
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
assert(backgroundTask != UIBackgroundTaskInvalid)
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()
}
}
}
})
}