我的childAdded应用程序中有一个通知表的Firebase 事件侦听器,当该应用程序在后台时,我想触发推送通知。
childAdded
这是监听器:
@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方法中添加一个后台观察器,以在后台对其进行观察:
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要从数据库侦听器中激活一个。
UNNotificationRequest
我也发现了这篇文章:FCM后台通知在iOS中不起作用, 但又一次,这与我的用例不同,因为它是在FIRMessaging框架中使用的。
FIRMessaging
因此,当应用程序在后台运行时,是否可以运行此数据库侦听器? 如果不是,我是否可以让Firebase CloudMessenger观察表中的更改并发送通知?
设备具有管理后台网络呼叫的方式,因此像这样处理后台推送通知将无法在实际设备上运行。应用程序进入后台后不久,观察者将从内存中删除。我可以通过创建一个Node.js服务器来解决此问题,该服务器观察该notifications表并使用Firebase- Messenger框架处理推送通知。这实际上很容易。我以这篇博文作为指导: 使用Firebase数据库和Cloud Messaging在Android设备之间发送通知
notifications
但是,只要将包含观察者的对象(在本例中为应用程序委托)传递给后台线程调用,该方法就可以在模拟器中工作( 但在实际设备上则不行 ):
func applicationWillResignActive(_ application: UIApplication) { NotificationCenter.default.addObserver(self, selector: #selector(self.observeNotificationsChildAddedBackground), name: notificationBackgroundProcessName, object: self) }