4

Ich habe einen Firebase childAdded Ereignis-Listener für die Benachrichtigungstabelle in meiner App, die ich Push-Benachrichtigungen auslösen möchte, wenn die App im Hintergrund ist. HierFirebase-Listener, wenn App im Hintergrund ist

ist der Hörer:

@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)") 
     } 
    } 
} 

Dies funktioniert gut, wenn der App im Vordergrund steht. Ich füge dann einen Hintergrund Beobachter in meinen app Delegierten applicationWillResignActive Verfahren es im Hintergrund zu beobachten:

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

Aber das Ereignis Beobachter nicht ausgelöst, wenn die Anwendung im Hintergrund ist. Ive sah in Firebase Cloud-Messenger, dieses Problem zu lösen und Beiträge wie diese kommen across:

Is it possible to send PushNotifications, using Firebase Cloud Messaging (FCM) to special UDID, directly from device?

aber ich bin nicht eine Push-Benachrichtigung von einem Benutzer zum anderen senden versuchen, ich versuche ein aktivieren UNNotificationRequest aus dem Datenbank-Listener.

Ich fand auch diesen Beitrag: FCM background notifications not working in iOS aber wieder, das von meinem Anwendungsfall unterscheidet, weil seine im FIRMessaging Rahmen verwendet wird.

Ist es also möglich, diesen Datenbank-Listener auszuführen, wenn sich die App im Hintergrund befindet? Wenn nicht, ist es möglich, dass Firebase Cloud Messenger Änderungen in einer Tabelle beobachtet und eine Benachrichtigung sendet?

Antwort

1

Geräte haben ihre eigene Art, Hintergrund-Netzwerkanrufe zu verwalten, so dass die Handhabung von Hintergrund-Push-Benachrichtigungen wie dieser auf echten Geräten nicht funktioniert. Die Beobachter werden aus dem Speicher entfernt, kurz nachdem die App in den Hintergrund tritt. Ich konnte dies lösen, indem ich einen Node.js-Server erstellte, der die notifications-Tabelle beobachtet und Push-Benachrichtigungen mit dem Firebase-Messenger-Framework handhabt. Es war eigentlich ziemlich einfach. Ich habe diese Blog-Post als meinen Führer: Sending notifications between Android devices with Firebase Database and Cloud Messaging

Diese Methode funktioniert jedoch im Simulator (aber nicht auf reale Geräten), solange Sie das Objekt mit dem Beobachter (die app-Delegaten in diesem Fall) übergeben zum Hintergrund Thread Anruf wie folgt:

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

Einfache Lösung wäre, Hintergrund holen zu verwenden. Sie können auch den Hintergrund-Abruf verwenden, um die Tabelle regelmäßig für neue Einträge abzurufen und eine Benachrichtigung anzuzeigen, wenn eine neue Zeile hinzugefügt wird.

Dies stellt nicht sicher, dass Benachrichtigungen sofort empfangen werden. Die Implementierung ist jedoch viel einfacher als die Verwendung eines APN.

+0

Dies ist definitiv eine gute Option, die ich untersucht habe. Es funktionierte nicht für mich persönlich, weil ich die Benachrichtigungen benötigt, um live zu sein, wo diese Methode die Abrufe periodisch verursacht. –

2

Ich hatte das gleiche Problem und stieß auf Ihre Post vor Monaten. Es ist mir endlich gelungen zu verstehen, was man benötigt, um Benachrichtigungen im Hintergrund zu beobachten.

Ich habe die Lösung detailliert, dass ich in diesem Beitrag bin mit https://stackoverflow.com/a/42240984/7048719

Die Technik ist als

  1. einen Datendienst benutzerdefinierten folgt Klasse verwenden
  2. initialisieren eine sharedInstance der Daten Serviceklasse
  3. rufen Sie die entsprechende Funktion im Datendienst auf e Klasse sharedInstance von Ihrem ursprünglichen View-Controller.

diese Weise kann der Betrachter in Erinnerung

-Update bleibt: implementiert Updates in Bezug auf die Hintergrund-Modi von Apple, die diese Methode von der Arbeit aufgehört haben.

+0

@DustinSpengler Danke, ich hoffe es ist nützlich. Beachten Sie die Speicherbelegung in Bezug auf Firebase-Beobachter, verwenden Sie dieses System jedoch schon seit einiger Zeit mit großem Erfolg – shektek

Verwandte Themen