当应用在后台

时间:2017-02-09 05:49:57

标签: ios swift firebase firebase-realtime-database

我一直在尝试使用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侦听器保留在内存中。

1 个答案:

答案 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