我一直在尝试使用Firebase侦听器来触发本地通知。我找到了一个post,它正好解释了我要解释的内容,但是我没有在帖子上发表评论的声誉,似乎没有迹象表明如何实现我想要的其他任何地方。
原始海报说明了这一点。
我明白了!我不得不使用不同的方法,但我能够 让我的Firebase数据库观察者触发通知 背景
只要包含数据库观察者的对象不是 从记忆中解除分配,它将继续观察和触发。所以我 创建了一个包含静态数据库对象的全局类 这样的财产:
class GlobalDatabaseDelegate {
static let dataBase = DataBase()
}
这是我对自己的项目做些什么感到困惑的地方。我的理解是我必须创建一个类似于DataBase()的类,它包含我的数据库引用。问题是我不明白如何创建将包含数据库侦听器的类对象。
比方说我的参考是:
let userRef = FIRDatabase.database.reference().child("users")
我想观察添加到数据库的所有用户,然后触发本地通知。我能够编写代码来执行此操作,只是不确定如何将其包含在自己的对象类中,然后将其设置为静态。
原谅我有点慢。非常感谢任何帮助。
帖子的其余部分如下:
我还将DataBase类扩展为 UNUserNotificationCenterDelegate因此它可以发送推送通知 像这样:
extension DataBase: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("Tapped in notification")
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
print("Notification being triggered")
completionHandler( [.alert,.sound,.badge])
}
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)")
}
}
}
}
本质上,我试图在应用程序处于后台时将firebase侦听器保留在内存中。
答案 0 :(得分:3)
所以我链接的原帖有答案,但这是理解它的问题。我也用稍微不同的方法实现了我的代码。
我发现了另一篇文章,详细介绍了运行自定义数据服务类所需的技术。 Custom Firebase Data Service Class : Swift 3
要将firebase侦听器保留在内存中,只需几步。
1.创建一个firebase数据服务类。在那个类中,我有一个属于同一类的静态变量
class FirebaseAPI {
var isOpen = false
static let sharedInstance = FirebaseAPI()
// I added functions for firebase reference in this class
func observeNotifications(){
//firebase call here
}
}
2.在app delegate中设置通知设置。这是我的设置与原始帖子不同的地方。
let notificationSettings = UIUserNotificationSettings(types: [.badge, .alert, .sound], categories: nil)
UIApplication.shared.registerUserNotificationSettings(notificationSettings)
3.在您选择的视图控制器中创建对firebase类的引用,它在app delegate中工作但不可取。
let sharedInstance = FirebaseAPI.sharedInstance
4.Call功能设置观察者
self.sharedInstance.observeNotifications()
然后,您可以使用具有该功能的完成处理程序触发本地通知,或者在firebase函数中触发通知。
更新:Apple已经实施了有关停止此方法工作的后台模式的更新。目前唯一的方法是使用APNS